Parallel类学习

来源:互联网 发布:如何手机淘宝购物 编辑:程序博客网 时间:2024/06/06 07:40

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只是退出当前循环,但是已经执行了的循环会继续往下执行。

1 0
原创粉丝点击