如何等待多个线程执行完成以后,再做处理的问题?
rehuo 2017-10-30 01:10:50 我现在有多个比较耗费时间的任务需要并行执行,每个任务都需要通知UI线程,更新前台显示,等这些任务都执行完毕以后,然后UI线程再进行下一步操作,比如通知用户等等。如果使用ManualResetEvent进行控制,执行顺序就有些问题。测试代码如下:
public partial class Form1 : Form
{
private SendTest sendtest ;
public delegate void DataUpdate(byte[] data, string type, ManualResetEvent sign);
public DataUpdate OnDataUpdate;
private static List<ManualResetEvent> mre = new List<ManualResetEvent>();
public Form1()
{
InitializeComponent();
sendtest = new SendTest(this);
OnDataUpdate += UpdateData;
}
private void button1_Click(object sender, EventArgs e)
{
richTextBox1.AppendText("开始处理!" + Environment.NewLine);
ManualResetEvent sign = new ManualResetEvent(false);
mre.Add(sign);
sendtest.Send(null, "1", sign);
sign = new ManualResetEvent(false);
mre.Add(sign);
sendtest.Send(null, "2", sign);
sign = new ManualResetEvent(false);
mre.Add(sign);
sendtest.Send(null, "3", sign);
foreach (ManualResetEvent item in mre)
{
sign.WaitOne();
}
richTextBox1.AppendText("处理完成!" + Environment.NewLine);
}
//更新界面
private void UpdateData(byte[] data, string type, ManualResetEvent Sign)
{
if (this.InvokeRequired)
{
//开关量
Sign.Set();
this.Invoke(OnDataUpdate, new object[] { data, type, Sign });
}
else
{
richTextBox1.AppendText("命令"+type+"处理完成!" + Environment.NewLine);
}
}
}
public class SendTest
{
public Form1 Owner;
public SendTest(Form1 owner)
{
this.Owner = owner;
}
//发送数据
public void Send(byte[] data, string type, ManualResetEvent item)
{
object[] paras = new object[] { data, type, item };
Thread threadStart = new Thread(new ParameterizedThreadStart(DataProcess));
threadStart.Start(paras);
}
//数据处理
private void DataProcess(object paras)
{
//参数列表
object[] list = paras as object[];
Thread.Sleep(1000);
Owner.OnDataUpdate(list[0] as byte[], list[1] as string, list[2] as ManualResetEvent);
}
}
有没有比较好的解决方法?