一、为了创建无阻塞应用程序,可以使用三种方式:
1.Thread 类型:
private void button1_Click(object sender, EventArgs e)
{
//使用Thread创建次线程执行后台任务
Thread t1 = new Thread(() => { ProcessFiles(); });
t1.Start();
}
2.异步委托:
private void button1_Click(object sender, EventArgs e)
{
//使用异步委托
Action a = ProcessFiles;
IAsyncResult ar = a.BeginInvoke(null, null);
}
3.使用 System.Threading.Tasks 命名空间中的类型简化操作,如:
private void button1_Click(object sender, EventArgs e)
{
//使用Task类简化操作
Task.Factory.StartNew(() => { ProcessFiles(); });
}
二、使用 System.Threading.Tasks命名空间封装的并行操作方法
.NET 4中新增加的并行处理类型Parallel、Task,旨在封装复杂的多线程操作,运行时会自动判断是否使用需要多核进行处理(自动优化)。主要包括两方面:数据并行、任务并行
1.数据并行:
通过迭代集合或数据,调用方法,经测试当方法中的任务很简单时,并行效率不如串行操作。
//数据同步执行
private void button5_Click(object sender, EventArgs e)
{
DateTime time1 = DateTime.Now;
for (int i = 0; i < 4; i++)
{
int a = 0;
int b = i * 10000000;
for (int j = 0; j < b; j++)
{
a += j;
}
}
DateTime time2 = DateTime.Now;
TimeSpan ts = time2 - time1;
MessageBox.Show(string.Format("用时:{0}秒", ts.TotalSeconds));
}
//数据并行
private void button4_Click(object sender, EventArgs e)
{
DateTime time1 = DateTime.Now;
Parallel.For(0, 4, (i) => {
MessageBox.Show(string.Format("当前线程:{0}", Thread.CurrentThread.ManagedThreadId));
int a = 0;
int b = i * 10000000;
for (int j = 0; j < b; j++)
{
a += j;
}
});
DateTime time2 = DateTime.Now;
TimeSpan ts = time2 - time1;
MessageBox.Show(string.Format("用时:{0}秒", ts.TotalSeconds));
}
2.任务并行:
多个互不相干的操作可以尽量利用多核并行执行。
//并行任务
private void button2_Click(object sender, EventArgs e)
{
DateTime time1 = DateTime.Now;
Parallel.Invoke(Task1, Task2);
DateTime time2 = DateTime.Now;
TimeSpan ts = time2 - time1;
MessageBox.Show(string.Format("用时:{0}秒", ts.TotalSeconds));
}
//同步任务
private void button3_Click(object sender, EventArgs e)
{
DateTime time1 = DateTime.Now;
Task1();
Task2();
DateTime time2 = DateTime.Now;
TimeSpan ts = time2 - time1;
MessageBox.Show(string.Format("用时:{0}秒", ts.TotalSeconds));
}