如何将此代码转换为异步等待?

炸药

我有很多这样的代码:

        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
}
谢尔盖·别列佐夫斯基(Sergey Berezovskiy)

您可以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.FromAsyncAPM API包装到Tasks中。

不幸的是,没有非泛型函数TaskCompletionSource会返回非泛型,Task因此通常的解决方法是使用Task<object>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章