3

我使用一个库,它有一个名为 DoWork(...) 的异步方法,该方法将在操作完成时引发 WorkDone 事件。

我想编写一个调用这个库的方法,但我不想保持相同的模式,而是希望我的方法async可以使用await.

本质上,我想做的是:

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

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

    return await result;
}

(不工作,因为 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 回答