C# Task.Run vs Task.WhenAll vs Parallel.Invoke vs others:并行运行任务并在C中获得结果#
下面选项1中的代码是并行运行任务的最佳方式吗 选项1C# 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
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
});