等待异步 Web 服务调用在任务中完成

本文关键字:任务 调用 异步 Web 服务 等待 | 更新日期: 2023-09-27 18:36:54

所以我对Windows Phone和C#有点陌生,所以我知道我的设置方式可能是错误的,所以也许有人可以指出我正确的方向。在移动应用程序中,我们需要能够在继续对其他方法的任何调用之前调用特定服务以生成会话 guid,因此从我目前阅读的内容来看,听起来我需要将该调用放在任务中,以便我可以使用 await 方法来防止下一个项目被调用,但我无法弄清楚的是任务中的方式调用 Web 服务方法并在任务完成之前获取结果。这是我到目前为止所拥有的,我已经尝试了来自各种来源的其他一些不起作用的东西,所以我决定将其剥离回我的第一次尝试,然后将其发布在这里寻求帮助。

public static async Task<Guid> GetAMSessionGUID()
{
    Debug.WriteLine("setting up client");
    AMClient client = new AMClient();
    Guid session = new Guid();
    client.GetSessionCompleted += delegate(object sender, GetSessionCompletedEventArgs e)
    {
        session = e.Result.session_ID;
        Debug.WriteLine("session completed " + session);
    };
    client.GetSessionAsync();
    return session;
}

等待异步 Web 服务调用在任务中完成

AMClient类型是什么?如何声明GetSessionAsync()方法?

我猜测,从你问题的性质来看,该方法是这样声明的:

public void GetSessionAsync()

并且"异步"是指该方法立即返回的事实,并在操作实际完成时引发GetSessionCompleted事件。如果是这样,则可以使用 TaskCompletionSource<T> 类来帮助您实现方法的 async/await 友好包装器。例如:

public static Task<Guid> GetAMSessionGUIDAsync()
{
    Debug.WriteLine("setting up client");
    AMClient client = new AMClient();
    TaskCompletionSource<Guid> completionSource = new TaskCompletionSource<Guid>();
    client.GetSessionCompleted += (sender, e) =>
    {
        Debug.WriteLine("session completed " + session);
        completionSource.SetResult(e.Result.session_ID);
    };
    client.GetSessionAsync();
    return completionSource.Task;
}

方法本身不需要async,因为它实际上并没有等待任何东西本身。请注意,我还将您的事件订阅更改为更简洁的 lambda 语法,并重命名了该方法,以便名称以单词 Async 结尾,这是此类方法的 .NET 约定。

TaskCompletionSource<T>对象执行两项相关操作:它为您提供了一个存储操作结果的位置;它为您提供了一个表示操作的Task<T>,并且可以像任何其他Task<T>一样等待。

因此,使用上述实现的方法,您可以使用如下所示的方法:

async Task DoSomeStuff()
{
    // do initial stuff
    Guid sessionGuid = await GetAMSessionGUIDAsync();
    // do some other stuff
}

您应该await调用的异步方法(通常是以异步结尾的方法)。

因此,在您提供的方法中,您应该await client.GetSessionAsync();

然后,您应该等待调用自己的方法(并且惯用地,您也应该在其名称中添加异步后缀)。