多线程Task异步/队列
线程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();
}

浙公网安备 33010602011771号