![](/img/trans.png)
[英]Bindable application bar on Windows Phone 8.1 Silverlight
[英]Main thread freezes when waiting for Web service synchronously in Windows Phone Silverlight Application 8/8.1
我有Windows Phone Silverlight应用程序。 我知道我要问的不是一种好的编程习惯,但是我仍然不明白为什么这种情况在Silverlight中不起作用。
我正在尝试做的是从主线程同步调用Web服务,以等待其他线程完成工作。
HttpClient httpClient = new System.Net.Http.HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "Web service address");
AutoResetEvent showSplash = new AutoResetEvent(false);
Thread uiThread = new Thread(async () =>
{
await httpClient.SendAsync(request);
showSplash.Set();
});
uiThread.IsBackground = true;
uiThread.Start();
showSplash.WaitOne();
我也尝试过此代码,但仍然冻结:
HttpClient httpClient = new System.Net.Http.HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "Web service address");
Task<HttpResponseMessage> response = Task.Run(async () => await httpClient.SendAsync(request));
response.Wait();
由于某些原因,主线程冻结,并且代码的执行在Wait()方法处停止。 有趣的是,这行代码在简单的WPF应用程序,Windows Phone 8.1 RT等中可以正常工作。
阻塞UI线程通常不是一个好主意,但是在这种情况下,这实际上是必须做的。
在Windows Phone中发出HTTP请求的所有方式在某个时候都需要UI线程(出于我未知的原因)。 也就是说,执行请求的方法的某些部分在UI线程中执行。 因此,阻止它会阻止发出请求,因此您将不会获得结果,并且线程永远不会被阻止。
我建议您找到一种在不阻塞UI线程的情况下执行操作的方法。 我只看到了一种真正需要阻止它的情况……在那种情况下,我使用套接字发出了请求,但这只是在找不到其他解决方案的情况下。
httpClient.SendAsync()将已经在单独的线程上被调用。 您实际上不需要执行任何操作。
public async void Button1Click(object sender, EventArgs e)
{
HttpClient httpClient = new System.Net.Http.HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "Web service address");
button1.Enabled = false;
await httpClient.SendAsync(request);
// this line will be called back on the main thread.
button1.Enabled = true;
}
这可能是因为您正在使用Wait()和WaitOne()。 这些调用阻止了当前线程。 您应该改用await。 您虽然同时使用了await和wait()
http://msdn.microsoft.com/en-us/library/hh191443.aspx
您可能想要这样的东西。 它不会启动新线程,但会异步运行,因此不会阻塞UI线程。
HttpClient httpClient = new System.Net.Http.HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "Web service address");
Task<HttpResponseMessage> response = await httpClient.SendAsync(request));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.