我有很多这样的代码:
var feed = new DataFeed(host, port);
feed.OnConnected += (conn) =>
{
feed.BeginLogin(user, pass);
};
feed.OnReady += (f) =>
{
//Now I'm ready to do stuff.
};
feed.BeginConnect();
如您所见,我使用惯常的异步操作方式。如何更改此代码以使用async await
?最好是这样的:
public async void InitConnection()
{
await feed.BeginConnect();
await feed.BeginLogin(user, pass);
//Now I'm ready
}
您可以TaskCompletionSource<T>
用来将EAP(基于事件的异步模式)包装到Tasks中。目前尚不清楚如何在DataFeed类中处理错误和取消操作,因此您将需要修改以下代码并添加错误处理(示例):
private Task ConnectAsync(DataFeed feed)
{
var tcs = new TaskCompletionSource<object>();
feed.OnConnected += _ => tcs.TrySetResult(null);
feed.BeginConnect();
return tcs.Task;
}
private Task LoginAsync(DataFeed feed, string user, string password)
{
var tcs = new TaskCompletionSource<object>();
feed.OnReady += _ => tcs.TrySetResult(null);
feed.BeginLogin(user, pass);
return tcs.Task;
}
现在,您可以使用以下方法:
public async void InitConnection()
{
var feed = new DataFeed(host, port);
await ConnectAsync(feed);
await LoadAsync(feed, user, pass);
//Now I'm ready
}
注意-您可以将这些异步方法移至DataFeed类。但是,如果您可以修改DataFeed,则最好TaskFactory.FromAsync
将APM API包装到Tasks中。
不幸的是,没有非泛型函数TaskCompletionSource
会返回非泛型,Task
因此通常的解决方法是使用Task<object>
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句