C#桌面应用如何等待API项目调用指定函数执行
解决方案
1. 区分调用来源(核心前提)
最直接可靠的方式是给方法加标识参数,明确调用方是UI还是API:
// 修改方法签名,增加调用来源标识 private void HandleRequest(IWpointDestinationRequest wpointRequest, bool isApiCall = false) { // 原有业务逻辑 // DoSomething // 仅API调用时执行SendReply if (isApiCall) { wpointRequest.SendReply(); } }
如果不能修改方法签名,可以通过调用方名称判断(需要提前知道API侧的调用方法名):
using System.Runtime.CompilerServices; private void HandleRequest(IWpointDestinationRequest wpointRequest, [CallerMemberName] string callerName = "") { // 原有业务逻辑 // DoSomething // 替换成实际API调用的方法名 if (callerName == "ApiInvokeEntry") { wpointRequest.SendReply(); } }
2. 实现API调用的等待逻辑
如果API侧需要等待HandleRequest处理完成再继续,推荐用异步方案避免线程阻塞:
// 改为异步方法,支持await等待 private async Task HandleRequestAsync(IWpointDestinationRequest wpointRequest, bool isApiCall = false) { // 原有逻辑如果是异步就用await,同步逻辑直接执行 await DoSomethingAsync(); if (isApiCall) { // 若SendReply是异步方法则用await,同步则直接调用 await wpointRequest.SendReplyAsync(); // wpointRequest.SendReply(); } } // API侧调用示例: await HandleRequestAsync(apiRequest, isApiCall: true);
如果必须用同步等待,可使用轻量信号量(注意避免UI线程死锁):
// 定义线程安全的信号量 private readonly ManualResetEventSlim _apiWaitEvent = new ManualResetEventSlim(false); private void HandleRequest(IWpointDestinationRequest wpointRequest, bool isApiCall = false) { try { // 原有业务逻辑 // DoSomething if (isApiCall) { wpointRequest.SendReply(); // 通知等待的API线程处理完成 _apiWaitEvent.Set(); } } finally { if (isApiCall) { _apiWaitEvent.Reset(); // 重置信号量供下次使用 } } } // API侧调用示例: HandleRequest(apiRequest, isApiCall: true); _apiWaitEvent.Wait(); // 等待处理完成
关键注意点
- 优先用标识参数区分调用方,不要依赖线程判断(API调用也可能跑在UI线程)
- 异步方案是推荐选型,避免阻塞UI或API线程
- 用信号量时要确保线程安全,避免重复触发或死锁
内容的提问来源于stack exchange,提问作者Abhijit
相关产品推荐
相关产品推荐

