为什么当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

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

关注微信公众号