AsParallel()并行问题

【Help】 2016-12-21 06:21:08
这里用.AsParallel()来做并行执行,但是发现,输出的还是顺序执行,只是线程不同,比如有一个执行时间很长,那所有的都要等待这条执行完成后才能进行执行下面,不是我想要的效果,请问什么情况呢?

using System.Collections.Generic;

namespace CSharp
{
using System;
using System.Linq;
using System.Threading;

public class Program
{
static string Output(string num)
{
Console.WriteLine("当前线程Id:{0},当前数字:{1}",Thread.CurrentThread.ManagedThreadId,num);
return num;
}
static void Main(string[] args)
{
List<string> list = new List<string>
{
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19"
};

var result = (from num in list
select Output(num)).AsParallel();
result.Max();
}
}
}


...全文
700 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
闭包客 2016-12-22
  • 打赏
  • 举报
回复
你的是并行操作了,只是测试用例没有完全反映出来。其实线程 Id 的不同也算反映出来了。 即使并行操作,先执行的线程,先得到结果,很合理啊。 楼上的阻塞随机的时间的做法是正解,因为执行的时间变化了,那么先执行的线程,可能会后得到结果。
sdfgrtyu 2016-12-22
  • 打赏
  • 举报
回复
那肯定是优化了,
  • 打赏
  • 举报
回复
最后的改动,加上一行初始化

        static Random rnd = new Random();
  • 打赏
  • 举报
回复
        static string Output(string num)
        {
            Console.WriteLine("当前线程Id:{0},当前数字:{1}", Thread.CurrentThread.ManagedThreadId, num);
            return num;
        }
        static void Main(string[] args)
        {
            List<string> list = new List<string>
            {
                "1",
                "2",
                "3",
                "4",
                "5",
                "6",
                "7",
                "8",
                "9",
                "10",
                "11",
                "12",
                "13",
                "14",
                "15",
                "16",
                "17",
                "18",
                "19"
            };

            var result = from num in list.AsParallel()
                         select Output(num);
            result.Max();
            Console.WriteLine("....................按任意键结束");
            Console.ReadKey();
        }
实际上故意增加一些延时来模拟不同计算速度不同,可以看得更清楚
        static string Output(string num)
        {
            Thread.Sleep(rnd.Next(100));
            Console.WriteLine("当前线程Id:{0},当前数字:{1}", Thread.CurrentThread.ManagedThreadId, num);
            return num;
        }
你使用 .AsParallel() 的方式,我只能说你是个“标题党”胡乱套用概念,而不是真正去了解细节。东北人说你这行代码“写的稀碎、写的烂七八糟”。
【Help】 2016-12-21
  • 打赏
  • 举报
回复
当前数字是顺序执行下来,不是我想像中的并行操作

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧