2

在我使用紧凑框架 3.5 的移动设备(windows mobile)程序中,我下载了一个文件并希望通过在 Windows.Forms.Label 中显示它来监视进度。

这是我的代码:

我的线程的开始(在按钮单击事件中)

ThreadStart ts = new ThreadStart(() => DownloadFile(serverName, downloadedFileName, this.lblDownloadPercentage));
Thread t = new Thread(ts);
t.Name = "download";
t.Start();
t.Join();

我的线程方法

static void DownloadFile(string serverName, string downloadedFileName, Label statusLabel)
{
      HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(serverName);
      do
      {
            //Download and save the file ...
            SetPercentage(statusLabel, currentProgress);
      } while(...)
 }

更新标签文本的方法

 private static void SetPercentage(Label targetLabel, string value)
 {
      if (targetLabel.InvokeRequired)
      {
           targetLabel.Invoke((MethodInvoker)delegate
           {
                targetLabel.Text = value;
           });
      }
      else
      {
           targetLabel.Text = value;
      }
 }

下载和保存部分工作正常,但是当涉及到 targetLabel.Invoke-part(第三个代码片段)时,程序停止做任何事情。没有崩溃,没有错误消息,没有异常。它只是停止。

这里出了什么问题?

顺便说一句,如果我离开 t.Join() ,线程根本不会启动......(为什么?)

4

1 回答 1

2

肯定你在DeadLock这里得到一个。

主线程正在等待,t.Join();然后当工作线程调用targetLabel.Invoke主线程时,主线程无法调用它,因为它正在等待,Join这永远不会发生。这种情况在计算机科学中称为死锁。

删除Join()它应该可以工作。

顺便说一句,如果我离开 t.Join() ,线程根本不会启动......(为什么?)

不知道那是什么,这不是应该的,尝试调试应用程序并弄清楚。如果找不到,请向我们提供更多信息以获得帮助。

希望这可以帮助

于 2013-10-07T09:12:03.193 回答