线程Task的简单应用,防止阻碍GUI界面(.NET4.0)
private void btn_Start_Click(object sender, EventArgs e) { Task taskSuper = new Task(() => { while (true) { for (int i = 0; i < 3; i++) { Task task = new Task(() => { WriteContent(i,"测试数据",DateTime.Now); }); task.Start(); Thread.Sleep(timmers * 1000); } } }); taskSuper.Start(); } /// <summary> /// 写日志 /// </summary> /// <param name="threadName"></param> /// <param name="content"></param> /// <param name="dt"></param> private void WriteContent(int threadName, string content, DateTime dt) { if (!string.IsNullOrEmpty(content)) { Delcalmethod(() => { Application.DoEvents(); ListViewItem lvi = new ListViewItem(); lvi.SubItems.Add("当前线程"); lvi.SubItems.Add("时间"); lvi.SubItems.Add("返回数据"); lvi.SubItems[0].Text = "当前线程:"+threadName; lvi.SubItems[1].Text = dt.ToLongTimeString(); lvi.SubItems[2].Text = content; listData.Items.Insert(0, lvi); }); } }
消息队列模式更新UI界面:
private Queue<int> threadQueue = new Queue<int>(100);//100可以自己定义 private void button1_Click(object sender, EventArgs e) { //100个对象入队,可以自己定义 for (int i = 0; i < 100; i++) { threadQueue.Enqueue(i); }; //队列控制线程 Thread queueTask = new Thread(new ThreadStart(() => { while (true) { //获取队列中的第一个线程 var current= threadQueue.Dequeue(); Thread th = new Thread(new ThreadStart(() => { TaskWork(current); })); th.Start(); //执行 //然后添加到最后一个 threadQueue.Enqueue(current); //10秒后进行下一次操作 Thread.Sleep(2 * 1000);//2秒 } })); queueTask.IsBackground = true; queueTask.Start(); } private void TaskWork(int i) { Console.WriteLine("线程" + i); WriteContent(i.ToString(), "返回数据", DateTime.Now); } /// <summary> /// 写日志 /// </summary> /// <param name="threadName"></param> /// <param name="content"></param> /// <param name="dt"></param> private void WriteContent(string threadName, string content, DateTime dt) { if (!string.IsNullOrEmpty(content)) { Delcalmethod(() => { Application.DoEvents(); ListViewItem lvi = new ListViewItem(); lvi.SubItems.Add("当前线程"); lvi.SubItems.Add("时间"); lvi.SubItems.Add("返回数据"); lvi.SubItems[0].Text = threadName; lvi.SubItems[1].Text = dt.ToLongTimeString(); lvi.SubItems[2].Text = content; listData333.Items.Insert(0, lvi); }); } } private void Delcalmethod(MethodInvoker method) { if (InvokeRequired) Invoke(method); else method(); }