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
中获取信息。将它们转换为浮动,然后按照您的方式操作,可以让我得到更好的东西,尽管这并不正确。