3

操作が完了すると WorkDone イベントを発生させる DoWork(...) という非同期メソッドを持つライブラリを使用します。

このライブラリを呼び出すメソッドを書きたいのですが、同じパターンを維持するのではなくasyncawait.

本質的に、私がやろうとしていることは次のとおりです。

public async Task<Result> SomeMethod()
{
    var result = new Task<Result>();

    library.WorkDone += (data) =>
    {
        result.Result = data;
    }
    library.DoWork();

    return await result;
}

(結果が読み取り専用のため、機能しません)

これはできますか?

4

2 に答える 2

5

ws0205の答えに基づいて構築します:

最初に、メソッドを "で呼び出す"awaitことを示します。を返すことでこれを実現しTaskます。

また、ws0205 の回答に次の調整を加えた方がよいと思います。

public Task<Result> SomeMethod() //no async, since we're not awaiting anything
{
   var result = new TaskCompletionSource<Result>();

   library.WorkDone += (data) =>
                                {
                                    result.TrySetResult(data); //just in case 
                                };
   library.DoWork();

   return result.Task; //no need to await - we're returning a Task - let the caller await (or not)
}
于 2013-04-25T06:27:46.273 に答える
2

TaskCompletionSourceを使用できます。

public async Task<Result> SomeMethod()
{
   var result = new TaskCompletionSource<Result>();

   library.WorkDone += (data) =>
                                {
                                    result.SetResult(data);
                                };
   library.DoWork();

   return await result.Task;
}
于 2013-04-25T05:38:19.767 に答える