c#Parallel类学习
Parallel类也属于多线程处理的一个类。
- Parallel类其实就是在Task基础上封装的,多个任务并行计算,而且主线程也在计算,其实就是Task + WaitAll的方式。代码如下:
Parallel.For(0, 5, t => {
Console.WriteLine("{0} For当前线程id={1}", t, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
new Action(() => { textBox1.AppendText(string.Format("{0} For当前线程id={1}", t, Thread.CurrentThread.ManagedThreadId) + "\r\n");}).Invoke();
});
textBox1.AppendText("上面执行完之后才会执行这行代码!!!" + "\r\n");
Parallel启动了5个线程,等到5个线程执行完之后再往下执行,相当无waitall,执行结果:
0 For当前线程id=9
2 For当前线程id=11
3 For当前线程id=12
1 For当前线程id=10
4 For当前线程id=13
上面执行完之后才会执行这行代码!!!
- Parallel foreach方法,其实和for方法大同小异
Parallel.ForEach(new int[] { 1, 2, 3, 4, 5 }, t =>
{
Thread.Sleep(10);
new Action(() => { textBox1.AppendText(string.Format("{0} For当前线程id={1} t={2}", t, Thread.CurrentThread.ManagedThreadId,t) + "\r\n"); }).Invoke();
});
执行结果:
1 For当前线程id=9 t=1
5 For当前线程id=13 t=5
2 For当前线程id=11 t=2
4 For当前线程id=10 t=4
3 For当前线程id=12 t=3
ParallelOptions
ParallelOptions options = new ParallelOptions() {MaxDegreeOfParallelism = 5};
MaxDegreeOfParallelism属性用来设置Parallel可启动多少个线程数。
ParallelOptions options = new ParallelOptions()
{
MaxDegreeOfParallelism = 5
};
Parallel.For(0, 100, options, t =>
{
Console.WriteLine("{0} For当前线程id={1}", t, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(3000);
});
上面代码中准备启动100个线程但是只会启动5个,因为MaxDegreeOfParallelism设置的是5.
-Parallel类的中的线程的取消和暂停
Parallel.For(0, 100, options, (t, state) =>
{
Console.WriteLine("{0} For当前线程id={1}", t, Thread.CurrentThread.ManagedThreadId);
state.Break();//循环结束
return;//带上return才有效
Thread.Sleep(3000);
});
这种就是在执行到 state.Break()的时候会不会再实行循环后面的代码,也就是说会退出循环。
Parallel.For(0, 100, options, (t, state) =>
{
Console.WriteLine("{0} For当前线程id={1}", t, Thread.CurrentThread.ManagedThreadId);
state.Stop();
return;//带上return才有效
Thread.Sleep(3000);
});
这种就是在执行到 state.Stop()的时候直接结束掉Parallel,不会再执行。 Break只是退出当前循环,但是已经执行了的循环会继续往下执行。