等待异步Web服务调用完成任务内部

时间:2015-01-08 22:58:01

标签: c# windows-phone-8.1

所以我对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;
}

2 个答案:

答案 0 :(得分:2)

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
}

答案 1 :(得分:0)

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

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

然后你应该等待调用你自己的方法(并且惯用,你也应该将Async后缀添加到它的名字中)。