【发布时间】:2021-08-08 18:45:17
【问题描述】:
我有 C# avalonia 应用程序通过开发人员提供的 SDK 使用了一些非线程安全的库。更具体地说是Windows Zoom SDK。一些 SDK 功能是基于事件驱动模式构建的。调用 SDK 方法后,应用程序必须等待执行结果回调到达。因此,基于任务的异步模式被应用到使用 TaskCompletionSource 的应用程序中(请参见下面的代码)。
在应用程序中应用 async/await 模式后,SDK 无法正常工作 (details)。但是,这个问题没有讨论使用 Zoom SDK。问题是使用 async/await 模式如何可能导致某些非线程安全库(或 SDK)的错误行为?
SDK 封装方法:
public async Task<bool> SdkMethodAAsync(string parameter)
{
try
{
this.sdkService.SdkMethodA(parameter);
this.tcs = new TaskCompletionSource<bool>();
return await this.tcs.Task;
}
catch (Exception)
{
return false;
}
return false;
}
SDK 回调处理程序:
public void OnMethodAReturn(MethodAResult ret)
{
// here some property can also be changed
// and which will trigger an event on which SDK calls can be made to
this.tcs.TrySetResult(ret == MethodAResult.METHODA_SUCCESS);
}
高级代码:
public async Task StartAsync(string parameter1, string parameter2)
{
var resultMethodA = await SdkMethodAAsync(parameter1);
var resultMethodB = await SdkMethodBAsync(parameter2);
}
【问题讨论】:
-
到底有什么问题?您是否看到
SdkMethodBAsync在错误的线程上被调用? -
@canton7 不,所有后续调用都在主线程上进行。这些调用(转换为 TAP)是初始化、身份验证和登录方法。所以接下来,SDK似乎处于不正确的状态(未正确处理用户,我收到意外回调,某些方法未正确执行)。在没有 TAP 的应用程序版本中,一切正常。其余程序相同。但我也承认 TAP 可能不是问题。也许我的问题更具理论性。会有哪些陷阱?
标签: c# sdk thread-safety taskcompletionsource avalonia