为什么当UI线程不再被阻塞时,以下代码在5秒钟后执行WebRequest? Thread.Sleep在UI线程中,而WebRequest的实例化和调用都发生在ThreadPool的线程内。

Loaded += (sender, args) => {

    for (int i = 0; i < 5; i++) {

        ThreadPool.QueueUserWorkItem(state => {
            var request = WebRequest.CreateHttp("http://google.com");
            request.BeginGetResponse(ar => Debug.WriteLine("Request finished"), null);
        });

        Thread.Sleep(1000);
    }

};

当UI线程被阻止时,我应该编写什么代码才能在后台线程中执行WebRequest?

编辑: ...更具体地说。 为什么此请求在后台线程中运行10秒钟后会被执行?

Loaded += (sender, args) => {

    ThreadPool.QueueUserWorkItem(state => {
        var request = WebRequest.CreateHttp("http://google.com");
        request.BeginGetResponse(ar => Debug.WriteLine("Request finished"), null);
    });
    Thread.Sleep(10000);

};

===============>>#1 票数:1 已采纳

我在这里问了几乎完全相同的问题(找到您的问题后,我将立即关闭): DownloadStringAsync是否需要UI线程?

答案是,所有网络代码最终都将在版本5之前的Silverlight中编组到UI线程中。不幸的是,即使我是针对Silverlight 5进行构建的,我仍然遇到相同的问题,因此我仍在调查...

===============>>#2 票数:0

也许您是想这样做:

Loaded += (sender, args) =>
{
    ThreadPool.QueueUserWorkItem(dummy =>
    {
        for (int i = 0; i < 5; i++)
        {

            ThreadPool.QueueUserWorkItem(state =>
            {
                var request = WebRequest.CreateHttp("http://google.com");
                request.BeginGetResponse(ar => Debug.WriteLine("Request finished"), null);
            });

            Thread.Sleep(1000);
        }
    });

};

这根本不会阻止UI,并且调试消息每秒都会到来。 或您想要的行为是什么? 您是否真的要阻止UI(您不应该...)?

编辑 (编辑后):

我懂了。 这有点违反直觉,我现在没有答案。 我强烈怀疑该请求需要一些UI线程活动。 您的主线程应始终响应且永不阻塞,因此这不会有问题。 除非您阻塞了主线程。 因此,他们可能会不遗余力地针对有缺陷的情况进行优化(这就是这种情况)。

不过,答案将很有趣。 我从桌面世界知道与浏览器相关的内容需要主线程。 所以我建议不要再阻止它了:)

  ask by djsolid translate from so

未解决问题?本站智能推荐:

1回复

如何从HttpWebRequest更新UI?

在Mainpage.xaml.cs文件中,我具有一个函数,该函数创建另一个类的实例,并尝试使用HttpWebRequest从该实例下载网页。 问题是,一旦我设法下载了网页,就无法将其发送回主UI线程。 我尝试使用Deployment.Current.Dispatcher.BeginInvok
6回复

等待HttpWebRequest.BeginGetResponse在Windows Phone 7中完成

我正在尝试在Silverlight for Windows Phone中使用异步HttpWebRequest 。 一切都很完美,直到我到达我应该打电话的地方 在GetResponseCallback : 调用allDone.WaitOne(); 它只是悬挂......
1回复

BeginGetResponse回调中的WP7 Propogate异常

我正在使用HttpWebRequest调用Web服务。 如果BeginGetResponse的AsyncCallback引发错误,我想将其传播到我的主程序流。 我在执行此操作时遇到了麻烦,因为该错误不会传播到AsyncCallback之外。 我已经尝试在HttpWebRequest链的每个
4回复

HttpWebRequest.EndGetResponse在Windows Phone 7中抛出NotSupportedException

在一个Silverlight-Windows Phone 7项目中,我正在创建一个HttpWebRequest,获取RequestStream,在Stream中写入内容并尝试获取响应,但我总是得到一个NotSupportedException:“System.Net.Browser.OHWRAs
2回复

在WP7中发出HTTP请求

我需要知道如何从WP7.1(mango)应用程序向其他服务器发出GET / POST请求 我尝试了通常的System.Web和System.Web.HTTP,但WP7不支持它们
3回复

如何在WP7中使用HttpWebRequest处理错误?

使用WebClient类时,您可以使用检查错误和清空结果 e.error!= null 和 e.result == null 分别。 我将如何使用HttpWebRequest类处理此问题? 所有示例似乎都省略了它,但它在应用程序中至关重要。
1回复

WebRequest中的错误

我正在使用WebClient一段时间。 (使用Mango SDK) 每次遇到错误时,错误消息始终为“未找到”。 该错误是由于登录问题,找不到服务器或页面所致。 任何错误代码> = 400都会导致相同的异常,并带有相同的消息且没有数据。 我尝试使用WebRequest /
2回复

在非UI线程上调用AsyncWaitHandle.WaitOne时出现NotSupportedException

我尝试等待HttpWebRequest完成而不编写十几个AsyncCallbacks。 为此,我尝试处理Task中的调用并在其中使用WaitOne->以便不会阻塞ui线程。 现在的问题是,每次我调用它时都会出现一个NotSupportedException,但我不明白为什么。 有
1回复

如何让普通的WebRequest异步和等待?

我需要使以下代码异步和等待。 我需要从Web服务器获取大量数据,然后这些数据将用于填充我的应用程序中的xaml页面。 所以,我需要DefLogin()方法是等待的。 可能吗? 我在StackOverflow上看到了这个问题: 使用Async和Await转换普通的Http
2回复

异步WebRequest出现问题

在我的第一页中,我启动了一个异步Webrequest页面加载事件。 使用此代码, Loadrecent()在加载的页面上成功启动。 假设我在第一页有一个按钮,将我带到另一页。 如果按“后退”按钮, Loadrecent()再次进入首页,并且Loadrecent()触发Loadrece