1

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);
    }
4

1 に答える 1