繁体   English   中英

在Windows Phone Silverlight应用程序8 / 8.1中同步等待Web服务时,主线程冻结

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM