我正在使用系统中的许多线程,事先我知道所有文件的总大小。当观察者被主体通知更改时,它隐含地知道已经下载了文件段。我将来会改变它,因为它不明确。
我遇到的问题是,如果我处理任何其他变量,我的百分比指标就不会更新。这是一个片段:
public delegate void ChangeUI(object subject);
public void Update(object subject)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new ChangeUI(Update), new object[] { subject });
return;
}
lock (otherlock)
{
toolstripStatus.Text = ((++totalDownloadedSegments / totalLengthAllFiles) * 100).ToString() + "% completed.";
}
// update the percentage indicator etc. (works fine)
//toolstripStatus.Text = ((FileDownloader)subject).PercentageCompleted().ToString() + "% completed.";
}
我正在使用this.InvokeRequired
来解决线程安全问题,所以请忽略它。注释掉的行工作正常,但锁中的那个根本不起作用,有或没有锁。 totalDownloadedSegments
是一个局部变量,totalLengthAllFiles
也是{{1}}(在整个过程中保持不变,不会被修改)。
正如你所看到的,我在线程方面并不是很好。我基本上想要一个百分比指标来找出我最后以百分比下载了多少文件。
答案 0 :(得分:3)
你在发现InvokeRequired方面做得很好。
注意totalDownloadedSegments和totalLengthAllFiles不是整数
因为如果您将99/100作为整数,它将变为0!要非常小心
所以而不是
((++totalDownloadedSegments / totalLengthAllFiles) * 100)
尝试
(100 * ++totalDownloadedSegments) / totalLengthAllFiles
或先把它们扔到漂浮物上!
答案 1 :(得分:0)
从我已完成多线程的应用程序中,我认为您需要这样做:
if (toolstripStatus.InvokeRequired)
{
toolstripStatus.BeginInvoke(new ChangeUI(Update), new object[] { subject });
return;
}
//Update here, Lock Variables that are global and could be used by other threads.