在移动设备程序(windows mobile)中,我使用紧凑型框架3.5, 我下载了一个文件,想通过在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(第3代码片段)时,程序停止执行任何操作。没有崩溃,没有错误消息,没有异常。它就此停止。
这里出了什么问题?
顺便说一句,如果我离开t.Join(),线程根本就没有开始......(为什么?)
答案 0 :(得分:2)
我确定你在这里得到DeadLock
。
主线程在t.Join();
中等待,然后当工作线程调用targetLabel.Invoke
主线程无法调用它,因为它在Join
中等待,这是永远不会发生的。这种情况在计算机科学中被称为Deadlock。
删除Join()
,它应该有效。
顺便说一句,如果我离开t.Join(),线程根本就没有开始......(为什么?)
不确定那是什么,这不是它应该如何,尝试调试应用程序并弄清楚。如果没有找到,请向我们提供更多信息以获得帮助。
希望这有帮助