如何在Windows Phone 8中同步调用异步方法

Sur*_*r R 3 c# asynchronous async-await xamarin windows-phone-8

我们已经使用Xamarin.Forms开发了现有的iOS应用程序.现在我们想扩展到Android和Windows Phone.在现有应用程序中,所有Web服务调用都是同步进行的.Windows phone仅支持异步调用,因此我们考虑将异步调用包装为同步.

我们使用HttpClient.PostAsync方法来访问该服务.一旦执行命中PostAsync方法,手机就会挂起.调用服务的代码如下:

private static async void CallService(System.Uri uri)
{
    using (HttpClient client = new HttpClient())
    {
        client.DefaultRequestHeaders.Host = uri.Host;
        client.Timeout = System.TimeSpan.FromSeconds(30);
        HttpContent content = new StringContent("", Encoding.UTF8, "application/xml");

        var configuredClient = client.PostAsync(uri, content).ConfigureAwait(false);
        var resp = configuredClient.GetAwaiter().GetResult();
        resp.EnsureSuccessStatusCode();
        responseString = resp.StatusCode.ToString();
        resp.Dispose();

        client.CancelPendingRequests();
        client.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这是因为阻止了UI线程,所以只有我实现了ConfigureAwait(false),但这根本不起作用.我尝试使用System.Net.WebClient但结果相同.

现在,我将如何使这个异步调用在Windows Phone 8中同步处理?

Sri*_*vel 5

首先避免使用异步void方法,因为你不能轻易等待它的完成.返回Task,在内部async方法,你不需要做一些特殊的东西返回Task.编译器为您完成所有工作.

您需要等待调用HttpClient.PostAsync,这应该足以保持UI响应.

private static async Task CallService(System.Uri uri)
{
    using (HttpClient client = new HttpClient())
    {
        client.DefaultRequestHeaders.Host = uri.Host;
        client.Timeout = System.TimeSpan.FromSeconds(30);
        HttpContent content = new StringContent("", Encoding.UTF8, "application/xml");

        var resp = await client.PostAsync(uri, content);// Await it
        resp.EnsureSuccessStatusCode();
        responseString = resp.StatusCode.ToString();
        resp.Dispose();

        client.CancelPendingRequests();
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我已删除了ConfigureAwait(false)不需要的内容.如果你真的需要它,你可以加回来.