C#:多线程 parallel 类研究

本文深入探讨了C#中的并行编程概念,包括Parallel类的功能介绍,Parallel.For和Parallel.ForEach方法的使用详解,以及Parallel.Invoke的并行任务模式。通过实例展示了如何控制并行循环的执行,并解释了ParallelLoopState对象的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

parallel概念

①Parallel类提供数据和任务的并行性;

Paraller.For()方法 类似于C#的for循环语句,也是多次执行一个任务。

使用Paraller.For()可以并行运行迭代,但迭代的顺序是打乱的

Paraller.For(int,int,Action<int>);

参数1为循环的开头,参数2为循环的结束;参数三是个委托,整数参数是循环的迭代次数,该参数被传递给委托引用的方法。返回类型是ParallelLoopResult结构,它提供了循环是否结束的信息和最低迭代的索引;

示例

//i=0-9
ParallelLoopResult result = Parallel.For(0, 10, i =>
{
   Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, 
                      Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
   Thread.Sleep(10);//延时
});

 Console.WriteLine("是否完成:{0}", result.IsCompleted);
 Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);

③Parallel.ForEach()

Paraller.ForEach()遍历实现了IEnumerable的集合,其方法类似于 foreach的语句,但以异步方式遍历这里也没有确定遍历顺序

先描述它的第一个方法,Paraller.ForEach<TSource>(IEnumerable<TSource>,Action<TSource>);

string[] data = { "str1", "str2", "str3" };
ParallelLoopResult result = Parallel.ForEach<string>(data, str =>
{
    Console.WriteLine(str);
});
Console.WriteLine("是否完成:{0}", result.IsCompleted);
Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);


string[] data = { "str1", "str2", "str3", "str4", "str5" };
ParallelLoopResult result = Parallel.ForEach<string>(data, (str, state, i) =>
{
  Console.WriteLine("迭代次数:{0},{1}", i, str);
  if (i > 3)
     state.Break();
});
 Console.WriteLine("是否完成:{0}", result.IsCompleted);
 Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);

Parallel.Invoke()

 Parallel.Invoke()提供了任务并行性模式。

Paraller.Invoke()方法允许传递一个Action委托数组,在其中可以指定应运行的方法,允许同时调用不同的方法

Parallel.Invoke(() =>
{
   Thread.Sleep(100);
   Console.WriteLine("method1");
}, () =>
{
    Thread.Sleep(10);
    Console.WriteLine("method2");
});

 

Parallel.For、Parallel.ForEach函数的控制

①ParallelLoopState对象被用来控制Parallel.For函数的执行,ParallelLoopState对象是程序运行时在后台创建的;

Parallel.For(1, 100, (i, ParallelLoopState) =>{...});

②ParallelLoopState对象有两个函数Stop、Break

Stop:表示Parallel.For的执行立刻停止,无论其他执行单元是否达到停止的条件;

Break:表示满足条件的当前执行单元立刻停止,其他未满足停止条件的则会继续执行下去;

【注】:break类似于for的continue, 而stop就类似于for的break。

Parallel.For(1, 100, (i, ParallelLoopState) =>
{  
   // 当某一个循环单元的数大于30,
   // 则跳出当前执行单元,等待其他执行单元结束
   // 所有执行单元结束后退出Parallel.For的执行
   if (i > 30)
    {
        // 跳出当前执行单元
        ParallelLoopState.Break();
        return;//不加return,可能会发生该进程资源未释放。
    }
 });


Parallel.For(1, 100, (i, ParallelLoopState) =>
{
  // 当某一个循环单元的数大于30,
  // 则停止Parallel.For的执行
  if ( i > 30)
  {
     // 停止并退出Parallel.For
     ParallelLoopState.Stop();
     return;
  }
 });

ParallelLoopResult result = Parallel.For(0, 10, (i, state) =>
{
   Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, 
                     Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
   Thread.Sleep(10);
   if (i > 5)
      state.Break();
});
Console.WriteLine("是否完成:{0}", result.IsCompleted);
Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);

【注】:Parallel.ForEach函数一样用法;

参考文章

1. https://www.cnblogs.com/WMTcore/p/3913066.html

2.https://www.cnblogs.com/ricky-wang/p/7003162.html

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值