多线程不刷新表单

时间:2014-01-31 13:57:06

标签: c# multithreading

我遇到多线程问题,使用表单。问题是:我有一个表格,还有一个班级。我有问题刷新表单屏幕。表单屏幕有五个复选框,根据我sample类的五个属性进行检查。

public Boolean ip1 { get; set; }    
public Boolean ip2 { get; set; }    
public Boolean ip3 { get; set; }    
public Boolean ip4 { get; set; }    
public Boolean ip5 { get; set; } 

主窗体类有一个函数private void test(),在加载窗体时调用它:

new Thread(test).Start(); 

private void test()函数调用sample.getCon()类中的sample,此函数getCon()调用更多五个线程,这些线程使用不同的IP进行ping操作然后设置函数ip1, ip2, ip3...内的表单类private void test()的属性刷新表单:

this.BeginInvoke((Action)(() =>     
        checkBox1.Checked = sample.ip1;    
        checkBox1.Checked = sample.ip2;    
        checkBox1.Checked = sample.ip3;    
        checkBox1.Checked = sample.ip4;    
        checkBox1.Checked = sample.ip5;    
)

表单有时会检查2或3个复选框,有时会检查4或3,当我处于调试模式时,验证所有属性是否都为真(我意识到所有属性都是真的)并且所有复选框都被检查,我认为这是因为线程有时间处理。那么,有人知道线程发生了什么?

1 个答案:

答案 0 :(得分:2)

所以你说的是这个序列:

  1. 表单开始
  2. 表格开始线程T1
  3. T1再启动五个线程(T5,T6,T7,T8,T9)
  4. T1线程设置sample.ip1,2,3,4,5
  5. 的值
  6. T1 BeginInvoke设置复选框。
  7. 问题是:T1从步骤3进入步骤4 而T5,6,7,8,9仍然在运行

    您应该使用Thread.Join来确保在其他后台线程继续之前T1不会继续。

    注意:考虑使用任务并行库而不是直接使用线程。 http://msdn.microsoft.com/en-us/library/vstudio/dd537609.aspx