在BackgroundWorker线程中下载文件时GUI冻结

时间:2011-05-20 18:04:01

标签: c# httpwebrequest backgroundworker

BackgroundWorker帖子中(以RunWorkerAsync()开头)我想通过HttpWebRequest从服务器下载文件。一旦我调用GetResponse(),当从服务器下载文件时,GUI仍然会冻结。这实际上不应该发生,因为BackgroundWorker与具有一些装饰(如进度处理和取消)的线程或多或少相同。任何人都能解释一下为什么会这样吗?

这里是代码段:

            if ((lRequest = (HttpWebRequest)WebRequest.Create(lURL)) != null)
            {
                if ((lResponse = lRequest.GetResponse()) != null)
                {
                    lRemoteStream = lResponse.GetResponseStream();
                    lLocalStream = File.Create(lTempFileName);

                    do
                    {
                        lBytesRead = lRemoteStream.Read(lTemp, 0, lTemp.Length);
                        lLocalStream.Write(lTemp, 0, lBytesRead);
                    } while (lBytesRead > 0);
                }
            }

2 个答案:

答案 0 :(得分:1)

需要查看更多代码才能提供帮助。

我遇到类似问题的一种方式是我很快就向UI发送了很多进展,这实际上冻结了它。因此,虽然我的主要任务是在像你这样的另一个线程上运行,但我对UI的更新非常快,因为它会对UI线程产生负面影响。也许你在这里做类似的事情?

答案 1 :(得分:0)

在此期间我发现了问题,如果我听了你的话,你可能已经回答了我的问题:/

如果启动BackgroundWorker线程,请注意不要指向UI主线程。 就我而言,我是这样做的:

    private void BW_FriendInRequest_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            if (this.isLoggedIn)
                listIncomingRequests();

            Thread.Sleep(Config.mMessagesCheckSleep);
        }
    }


    private delegate void listIncomingRequestsDelegate();
    private void listIncomingRequests()
    {
        if (InvokeRequired)
        {
            listIncomingRequestsDelegate d = new listIncomingRequestsDelegate(listIncomingRequests);
            this.Invoke(d, new object[] { });
            return;
        }
       ...
    }

一旦我删除了“InvokeRequired”,冻结效果就消失了。