Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Task.Run vs Task.WhenAll vs Parallel.Invoke vs others:并行运行任务并在C中获得结果#_C#_.net - Fatal编程技术网

C# Task.Run vs Task.WhenAll vs Parallel.Invoke vs others:并行运行任务并在C中获得结果#

C# Task.Run vs Task.WhenAll vs Parallel.Invoke vs others:并行运行任务并在C中获得结果#,c#,.net,C#,.net,下面选项1中的代码是并行运行任务的最佳方式吗 选项1 var w = Task.Run(async () => await Work1()); var w2 = Task.Run(async () => await Work2()); Console.WriteLine("end: " + DateTime.Now.ToString("hh:mm:ss.fff")); await w; await w2; Console.WriteLine("last: " + DateTime.N

下面选项1中的代码是并行运行任务的最佳方式吗

选项1

var w = Task.Run(async () => await Work1());
var w2 = Task.Run(async () => await Work2());
Console.WriteLine("end: " + DateTime.Now.ToString("hh:mm:ss.fff"));
await w;
await w2;
Console.WriteLine("last: " + DateTime.Now.ToString("hh:mm:ss.fff") + " " + w.Result + " " + w2.Result);
Console.WriteLine("end");
结果:

end: 06:07:13.054
Work2 s 06:07:13.057
Work1 s 06:07:13.057
Work1 e 06:07:16.072
Work2 e 06:07:17.066
last: 06:07:17.066 1 2
Work1 s 06:11:42.565
Work2 s 06:11:44.571
Work1 e 06:11:45.579
end: 06:11:47.572
Work2 e 06:11:48.574
end2: 06:11:48.575
last: 06:11:48.579 1 2
选项2: 它在等待时转为其他工作

            var tasks = new List<Task<int>>();
            tasks.Add(Work1());
            tasks.Add(Work2());
            Console.WriteLine("end: " + DateTime.Now.ToString("hh:mm:ss.fff"));
            await Task.WhenAll(tasks);
            Console.WriteLine("end2: " + DateTime.Now.ToString("hh:mm:ss.fff"));
            Console.WriteLine("last: " + DateTime.Now.ToString("hh:mm:ss.fff") + " " + tasks[0].Result + " " + tasks[1].Result);
任务

private静态异步任务Work1()
{
Console.WriteLine(“work1s”+DateTime.Now.ToString(“hh:mm:ss.fff”);
《睡眠》(2000年);
等待任务。延迟(1000);
Console.WriteLine(“work1e”+DateTime.Now.ToString(“hh:mm:ss.fff”);
返回1;
}
专用静态异步任务Work2()
{
Console.WriteLine(“work2s”+DateTime.Now.ToString(“hh:mm:ss.fff”);
睡眠(3000);
等待任务。延迟(1000);
Console.WriteLine(“work2e”+DateTime.Now.ToString(“hh:mm:ss.fff”);
返回2;
}
Parallel.Invoke()不返回结果。

Parallel.Invoke()
接受
params Action[]
,这意味着您需要传递一个列表,如果要更准确的话-动作数组,动作给它。简单地说,您需要传递一个方法来执行。简单地调用
Parallel.Invoke()
是行不通的

这里有一个来自中国的例子

仔细阅读了你的问题后,我想到了更多的问题。 如果您尝试使用
Parallel.ForEach()
,该怎么办

它可能看起来像这样:

Parallel.ForEach(tasks, task =>{
var result = task.Invoke();
//You can do whatever you want with result
});
假设
任务
列表
,更准确地说,是需要执行的任务的一部分。

并行。Invoke()
接受
参数Action[]
,这意味着您需要传递一个列表,如果要更准确的话-操作数组,则向其传递操作。简单地说,您需要传递一个方法来执行。简单地调用
Parallel.Invoke()
是行不通的

这里有一个来自中国的例子

仔细阅读了你的问题后,我想到了更多的问题。 如果您尝试使用
Parallel.ForEach()
,该怎么办

它可能看起来像这样:

Parallel.ForEach(tasks, task =>{
var result = task.Invoke();
//You can do whatever you want with result
});

假设
任务
列表
,如果更准确的话-
IEnumerable
,您需要执行的任务。

我需要测试它。但它似乎是并行的。ForEach和
task.Invoke
可以工作。但是,我需要为CRUD的每个结果记录不同的消息。例如,为第一个结果创建,为第二个结果更新,依此类推。因此,我的选项1似乎更简单,因为每个任务都分配给一个变量。由于
任务
是一个
操作
,您可以在括号内发布缺少的代码,也可以应用AOP(面向方面编程)或代理模式。您可以有一个方法,该方法具有
logStartTime
logEndTime
以及任务执行之间的时间间隔。你怎么认为?但我想这超出了这个问题的范围。总的来说,如果你觉得我的答案有帮助,请标记为接受,伙计。我需要测试它。但它似乎是并行的。ForEach和
task.Invoke
可以工作。但是,我需要为CRUD的每个结果记录不同的消息。例如,为第一个结果创建,为第二个结果更新,依此类推。因此,我的选项1似乎更简单,因为每个任务都分配给一个变量。由于
任务
是一个
操作
,您可以在括号内发布缺少的代码,也可以应用AOP(面向方面编程)或代理模式。您可以有一个方法,该方法具有
logStartTime
logEndTime
以及任务执行之间的时间间隔。你怎么认为?但我想这超出了这个问题的范围。总的来说,如果你觉得我的答案有帮助,请标记为接受,伙计。
Parallel.ForEach(tasks, task =>{
var result = task.Invoke();
//You can do whatever you want with result
});