gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:54:47 25 4
gpt4 key购买 nike

我们现有的 iOS 应用程序是使用 Xamarin.Forms 开发的。现在我们想扩展到 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();
}
}

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

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

最佳答案

首先要避免使用async 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();
}
}

注意:我已经删除了 ConfigureAwait(false),因为它不是必需的。如果你真的需要它,你可以把它加回去。

关于c# - 如何在Windows Phone 8 中同步调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26889789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com