TaskCompletionSource 而不是线程安全库

问题描述

我有 C# avalonia 应用程序通过开发人员提供的 SDK 使用一些非线程安全的库。更具体地说是Windows Zoom SDK。一些 SDK 功能建立在事件驱动模式之上。调用 SDK 方法后,应用程序必须等待执行结果回调到达。因此使用taskcompletionsource(请参阅下面的代码)在应用程序中应用了基于任务的异步模式。

在应用程序中应用 async/await 模式后,SDK 无法正常工作 (details)。但是,此问题不讨论使用 Zoom SDK。问题是关于异步/等待模式的使用如何可能导致某些非线程安全库(或 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);
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...