У меня есть приложение C# avalonia, использующее некоторую не потокобезопасную библиотеку через SDK, предоставленный разработчиком. В частности, это Windows Zoom SDK а>. Некоторые функции SDK основаны на шаблоне, управляемом событиями. После вызова методов SDK приложение должно дождаться поступления обратного вызова результата выполнения. Поэтому в приложении был применен асинхронный шаблон на основе задач с использованием TaskCompletionSource (см. код ниже).
После применения шаблона async/await в приложении SDK работает некорректно (детали). Однако этот вопрос не обсуждает работу с 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
вызывается не в том потоке? - person canton7   schedule 19.05.2021