本文主要介绍C#中Parallel.Invoke相关介绍,及使用方法示例代码。
此示例展示用重载一的 Invoke并行使用静态方法、匿名委托和 lambda 表达式 。
static void Main(){try{Parallel.Invoke(BasicAction, // 参数 #0 -静态方法() => // 参数#1 - lambda表达式{Console.WriteLine("Method=beta, Thread={0}", Thread.CurrentThread.ManagedThreadId);},delegate() // 参数#2 - delegate委托{Console.WriteLine("Method=gamma, Thread={0}", Thread.CurrentThread.ManagedThreadId);});}//本例中不应出现异常,如果有异常会抛出当前异常的参数方法,而不影响其他参数。//它将被包装在AggregateException中并传播到主线程。catch (AggregateException e){Console.WriteLine("An action has thrown an exception. THIS WAS UNEXPECTED.\n{0}", e.InnerException.ToString());}}static void BasicAction(){Console.WriteLine("Method=alpha, Thread={0}", Thread.CurrentThread.ManagedThreadId);}
我们来看看运行结果:

从结果线程ID来看是运行了3个线程,三个参数的方法不是安装顺序执行。此方法运行后主线程必须等待它运行完成才执行下一步认为,如果Invoke参数中的方法执行时间相差太大就会出现时间参差不齐,影响效率,这时就没有必要使用Invoke了。如果有异常会抛出当前异常的参数方法,而不影响其他线程。
我们在看看重载2的使用
readonly static CancellationTokenSource _cts = new CancellationTokenSource();//这个需要设置局部变量static void Main(){var po = new ParallelOptions//第一个参数可以设置线程的特性{CancellationToken = _cts.Token, // 控制线程取消MaxDegreeOfParallelism = 2 // 设置最大的线程数3,仔细观察线程ID变化};try{Parallel.Invoke(po,BasicAction, () => BasicAction(po,""),BasicAction3);}catch (AggregateException e){Console.WriteLine(e.Message);}}//如果有参数需要按匿名方法二形式写,如() => BasicAction(po,"")static void BasicAction()//方法1{Console.WriteLine("Method=alpha1, Thread={0}", Thread.CurrentThread.ManagedThreadId);}static void BasicAction(ParallelOptions po,string task)//方法2{Console.WriteLine("Method=alpha2, Thread={0}", Thread.CurrentThread.ManagedThreadId);// 判断是否已经取消for(int i=0;i<100;i++){if (po.CancellationToken.IsCancellationRequested){Console.WriteLine("已经被取消。");return;}Thread.Sleep(100);}}static void BasicAction3()//方法3{Console.WriteLine("Method=alpha3, Thread={0}", Thread.CurrentThread.ManagedThreadId);Thread.Sleep(10000 * 10);//取消线程_cts.Cancel();Console.WriteLine("取消成功");}
重载2主要增加了一个配置参数,从这个参数可以配置最大线程数,线程取消等。
时间关系,今天就分享到这。欢迎留言讨论。