在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);
}
}
答案 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”,冻结效果就消失了。