Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对使用基于事件的异步模式的库使用async/await?_C#_Task Parallel Library_.net 4.5_Async Await_C# 5.0 - Fatal编程技术网

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

C# 如何对使用基于事件的异步模式的库使用async/await?,c#,task-parallel-library,.net-4.5,async-await,c#-5.0,C#,Task Parallel Library,.net 4.5,Async Await,C# 5.0,我使用一个库,该库具有一个名为DoWork(…)的异步方法,该方法将在操作完成时引发WorkDone事件 我想写一个调用这个库的方法,但是我不想保持相同的模式,而是希望我的方法是async,这样就可以用wait调用它 本质上,我想做的是: public async Task<Result> SomeMethod() { var result = new Task<Result>(); library.WorkDone += (data) =>

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

我想写一个调用这个库的方法,但是我不想保持相同的模式,而是希望我的方法是
async
,这样就可以用
wait
调用它

本质上,我想做的是:

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

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

    return await result;
}
public异步任务SomeMethod()
{
var result=新任务();
library.WorkDone+=(数据)=>
{
结果。结果=数据;
}
library.DoWork();
返回等待结果;
}
(不工作,因为结果为只读)

可以这样做吗?

您可以使用:

public异步任务SomeMethod()
{
var result=new TaskCompletionSource();
library.WorkDone+=(数据)=>
{
result.SetResult(数据);
};
library.DoWork();
返回等待结果。任务;
}

我将以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)
}
首先,您表示希望方法“通过
wait
调用”。您可以通过返回
任务
来实现这一点

我还认为最好对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)
}
public Task SomeMethod()//没有异步,因为我们没有等待任何东西
{
var result=new TaskCompletionSource();
library.WorkDone+=(数据)=>
{
result.TrySetResult(数据);//以防万一
};
library.DoWork();
return result.Task;//无需等待-我们正在返回任务-让调用方等待(或不等待)
}

好的,也可以。我在一个web服务器上使用它,你能确认即使没有async关键字,它也不会阻止线程吗?@G.Stoynev是的,线程不会被阻止,因为你返回
任务
,使用它的人需要使用
等待
关键字。有关更多信息,请参阅。