Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Windows Phone Silverlight应用程序8/8.1中同步等待Web服务时,主线程冻结_C#_Silverlight_Windows Phone 8.1 - Fatal编程技术网

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

C# 在Windows Phone Silverlight应用程序8/8.1中同步等待Web服务时,主线程冻结,c#,silverlight,windows-phone-8.1,C#,Silverlight,Windows Phone 8.1,我有一个Windows Phone Silverlight应用程序。我知道我所问的不是一个好的编程实践,但我仍然不明白为什么这个案例在Silverlight中不起作用 我试图做的是从主线程同步调用Web服务,等待另一个线程完成工作 HttpClient httpClient = new System.Net.Http.HttpClient(); HttpRequestMessage request = new HttpRequestMessage(HttpMeth

我有一个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();
HttpClient-HttpClient=new System.Net.Http.HttpClient();
HttpRequestMessage请求=新的HttpRequestMessage(HttpMethod.Get,“Web服务地址”);
Task response=Task.Run(async()=>wait-httpClient.sendaync(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()。这些调用正在阻止当前线程。您应该使用wait。您正在使用wait和wait()

你可能想要这样的东西。它不会启动新线程,但会异步运行,因此UI线程不会被阻塞

  HttpClient httpClient = new System.Net.Http.HttpClient();
  HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "Web service address");

  Task<HttpResponseMessage> response = await httpClient.SendAsync(request));
HttpClient-HttpClient=new System.Net.Http.HttpClient();
HttpRequestMessage请求=新的HttpRequestMessage(HttpMethod.Get,“Web服务地址”);
任务响应=等待httpClient.SendAsync(请求));

OMFG。真正地他们在UI线程上执行http请求的一部分?我很想得到一个解释。。。嘿嘿。@TomTom但是嘿!现在发出HTTP请求时,没有人阻止UI线程!说真的,我也希望得到一个解释,因为这对我来说一点都不正常。谢谢你@yasen!你的回答很有帮助。正如我所见,要找到解决这个问题的办法并不容易。@Kristina很高兴我能帮上忙。:)我可以问一下为什么需要阻止UI线程吗?在大多数情况下,可以简单地发出异步请求,正如其他答案所建议的那样。是什么阻止了你?@yasen应用程序的复杂性。我为我的项目共享了代码,获取数据的接口是同步的。对服务的请求并不耗时,因此我认为可以使其同步,省去重写所有内容的麻烦:)当我从URL获取数据时,我喜欢使用带有回调的
HttpWebRequest
+
BeginGetResponse
,我不想阻止UI。