如何使用async/await与使用基于事件的异步模式的库?

Xav*_*nas 3 c# task-parallel-library async-await c#-5.0 .net-4.5

我使用一个名为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;
}
Run Code Online (Sandbox Code Playgroud)

(因为结果是只读的而无法工作)

可以这样做吗?

G. *_*nev 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)
}
Run Code Online (Sandbox Code Playgroud)