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中同步处理?
首先避免使用异步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)
不需要的内容.如果你真的需要它,你可以加回来.
归档时间: |
|
查看次数: |
783 次 |
最近记录: |