Parallel.Invoke何时有用?

kd7*_*kd7 2 c# parallel-processing .net-4.0 c#-4.0

我正在深入学习4.0框架中的Parallel类,并试图了解它何时有用.在查看了一些文档后,我尝试执行两个循环,一个使用Parallel.Invoke,一个顺序如下:

static void Main()
{
    DateTime start = DateTime.Now;
    Parallel.Invoke(BasicAction, BasicAction2);
    DateTime end = DateTime.Now;
    var parallel = end.Subtract(start).TotalSeconds;

    start = DateTime.Now;
    BasicAction();
    BasicAction2();
    end = DateTime.Now;
    var sequential = end.Subtract(start).TotalSeconds;

    Console.WriteLine("Parallel:{0}", parallel.ToString());
    Console.WriteLine("Sequential:{0}", sequential.ToString());
    Console.Read();
}
static void BasicAction()
{
    for (int i = 0; i < 10000; i++)
    {
        Console.WriteLine("Method=BasicAction, Thread={0}, i={1}", Thread.CurrentThread.ManagedThreadId, i.ToString());
    }
}

static void BasicAction2()
{
    for (int i = 0; i < 10000; i++)
    {
       Console.WriteLine("Method=BasicAction2, Thread={0}, i={1}", Thread.CurrentThread.ManagedThreadId, i.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的执行时间没有明显的差异,或者我错过了这一点?它是否对Web服务的异步调用或...更有用?

编辑:我用秒表删除了DateTime,通过简单的添加操作删除了对控制台的写入.

更新 - 现在的大时间差异:感谢您清理我参与控制台时遇到的问题

static void Main()
{
    Stopwatch s = new Stopwatch();
    s.Start();
    Parallel.Invoke(BasicAction, BasicAction2);
    s.Stop();
    var parallel = s.ElapsedMilliseconds;

    s.Reset();
    s.Start();
    BasicAction();
    BasicAction2();
    s.Stop();

    var sequential = s.ElapsedMilliseconds;

    Console.WriteLine("Parallel:{0}", parallel.ToString());
    Console.WriteLine("Sequential:{0}", sequential.ToString());
    Console.Read();
}

static void BasicAction()
{
    Thread.Sleep(100);

}

static void BasicAction2()
{
    Thread.Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ris 6

你正在做的测试是荒谬的; 你正在测试,如果你并行执行它,看看你不能并行执行的东西会更快.

Console.Writeline为您处理同步,因此它始终表现为在单个线程上运行.

这里:

...分别调用SetIn,SetOut或SetError方法.使用这些流的I/O操作是同步的,这意味着多个线程可以读取或写入流.

并行版本在多个线程上运行所获得的任何优势都会因控制台的编组而丢失.实际上,我不会惊讶地发现所有线程切换实际上意味着并行运行会更慢.

尝试在动作中执行其他操作(一个简单的Thread.Sleep会这样做)可以由多个线程同时处理,您应该看到运行时间的巨大差异.足够大以至于使用DateTime作为计时机制的不准确性并不重要.