コード全体で async/await パターンを使用しています。ただし、イベント ベースの非同期パターンを使用する API が 1 つあります。MSDN といくつかの StackOverflow の回答を読みましたが、これを行う方法は TaskCompletionSource を使用することです。
私のコード:
public static Task<string> Process(Stream data)
{
var client = new ServiceClient();
var tcs = new TaskCompletionSource<string>();
client.OnResult += (sender, e) =>
{
tcs.SetResult(e.Result);
};
client.OnError += (sender, e) =>
{
tcs.SetException(new Exception(e.ErrorMessage));
};
client.Send(data);
return tcs.Task;
}
そして次のように呼ばれます:
string result = await Process(data);
または、テスト用:
string result = Process(data).Result;
メソッドは常に非常に迅速に戻りますが、どちらのイベントもトリガーされません。
tcs.Task.Await(); を追加すると return ステートメントの直前では機能しますが、これは私が望む非同期動作を提供しません。
インターネットで見たさまざまなサンプルと比較しましたが、違いはわかりません。