C# 如何对使用基于事件的异步模式的库使用async/await?
我使用一个库,该库具有一个名为DoWork(…)的异步方法,该方法将在操作完成时引发WorkDone事件 我想写一个调用这个库的方法,但是我不想保持相同的模式,而是希望我的方法是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) =>
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是的,线程不会被阻止,因为你返回任务
,使用它的人需要使用等待
关键字。有关更多信息,请参阅。