C# 实时线程更新问题
我在一个系统中使用了许多线程,在这个系统中我预先知道所有文件的总大小。当观察者收到主题的更改通知时,它隐式地知道文件段已下载。我将在将来更改它,因为它不明确 我遇到的问题是,如果我处理任何其他变量,我的百分比指标不会得到更新。下面是一个片段:C# 实时线程更新问题,c#,multithreading,C#,Multithreading,我在一个系统中使用了许多线程,在这个系统中我预先知道所有文件的总大小。当观察者收到主题的更改通知时,它隐式地知道文件段已下载。我将在将来更改它,因为它不明确 我遇到的问题是,如果我处理任何其他变量,我的百分比指标不会得到更新。下面是一个片段: public delegate void ChangeUI(object subject); public void Update(object subject) { if (this.InvokeRequire
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.invokererequired
来解决线程安全问题,所以忽略它。注释掉的行可以正常工作,但是锁中的那一行根本不工作,不管有没有锁totalDownloadedSegments
是一个局部变量,TotalEngthallfiles也是一个局部变量(在整个过程中保持不变,不会修改)
正如你所看到的,我在穿线方面不是很好。我基本上想要一个百分比指示器,以确定我最终下载的所有文件的百分比。从我已经完成多线程的应用程序中,我认为您需要这样做:
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.
从我已经完成多线程的应用程序中,我认为您需要这样做:
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.
您在发现所需的调用方面做得很好 但要注意,totalDownloadedSegments和TotalEngthallfiles不是整数 因为如果你把99/100作为一个整数,它将变成0!!!要非常小心 所以不是
((++totalDownloadedSegments / totalLengthAllFiles) * 100)
试一试
或者先把它们扔到浮子上 您在发现所需调用方面做得很好 但要注意,totalDownloadedSegments和TotalEngthallfiles不是整数 因为如果你把99/100作为一个整数,它将变成0!!!要非常小心 所以不是
((++totalDownloadedSegments / totalLengthAllFiles) * 100)
试一试
或者先把它们扔到浮子上 作为诊断,UI是否似乎“冻结”?是否确实更新了
totalDownloadedSegments
和TotalEngthallfiles
?你对更新这些字段的代码有相同的锁定吗?是的,刚刚检查过,它们肯定正在更新。等等,你刚才是说totalDownloadedSegments是一个局部变量吗?这肯定不对吗?啊,我刚刚在Kezzer下面写下了答案:-)调试得很好,我在几次诊断中都发现了,UI似乎“冻结”了吗?你确定totalDownloadedSegments
和TotalEngthallfiles
确实在更新吗?你对更新这些字段的代码有相同的锁定吗?是的,刚刚检查过,它们肯定正在更新。等等,你刚才是说totalDownloadedSegments是一个局部变量吗?当然那是不对的?啊,我刚刚在Kezzer下面写下了答案:-)调试得很好,我在好几个场合都注意到了toolStripStatus
是一个UI对象,它没有invokererequired
可用。我不确定,但当我使用其他控件时,例如列表框等。,我使用过这种方法,可以很好地用于数百个并发线程更新它…toolStripStatus
是一个UI对象,它没有invokererequired
可用。我不确定,但当我使用其他控件(如列表框等)时。,我已经使用这种方法对数百个并发线程进行了很好的更新…这绝对是正确的。它们当前的类型是long
,因为我从类型FileInfo
中获取信息。将它们转换为浮动,然后按照你的方式来做,这会给我带来更好的东西,虽然不是正确的。这绝对是正确的。它们当前的类型是long
,因为我从类型FileInfo
中获取信息。将它们转换为浮动,然后按照您的方式操作,可以让我得到更好的东西,尽管这并不正确。