C# “表格”中是否有一些内置方法;同时等待RunManyTimes(numberOfTimes,myAction)“;? TL/DR:
我想知道是否有一种“c#内置优雅方式”并行运行C# “表格”中是否有一些内置方法;同时等待RunManyTimes(numberOfTimes,myAction)“;? TL/DR:,c#,task-parallel-library,async-await,C#,Task Parallel Library,Async Await,我想知道是否有一种“c#内置优雅方式”并行运行任务/操作多次,比如: await RunManyTimesConcurrently(numberOfTimes, myAction); await RunManyTimesConcurrently(N, myAction); 有吗 说明: 我有某些动作或动作,甚至有任务或任务或任务。我想启动该操作/任务N次,然后等待所有操作/任务完成。我可以这样做: var tasks = new List<Task>(); for (int i
任务
/操作
多次,比如:
await RunManyTimesConcurrently(numberOfTimes, myAction);
await RunManyTimesConcurrently(N, myAction);
有吗
说明: 我有某些
动作
或动作
,甚至有任务
或任务
或任务
。我想启动该操作/任务N次
,然后等待所有操作/任务完成。我可以这样做:
var tasks = new List<Task>();
for (int i = 0; i < 10; i++)
tasks.Add(new Task(() => myAction));
await Task.WhenAll(tasks);
我不喜欢第一种方法:它不必要地创建一个列表。我也不喜欢第二种方式:它创建了一种冗余的“信封”任务
我想知道是否有一种“c#内置优雅的方式”可以做到这一点,比如:
await RunManyTimesConcurrently(numberOfTimes, myAction);
await RunManyTimesConcurrently(N, myAction);
您的第一个示例是:
Parallel.For(0, 10, _ => myAction());
Parallel.For()。更改代码以从数组调用委托或向其传递一个或多个参数是很简单的。举个例子:
Parallel.For(0, 10, i => myAction(i, somethingElse));
请注意,somethingElse
将被并发访问,因此它必须是线程安全的(至少用于读取)。如果不是,则必须在myAction
中处理同步(无论是方法还是委托)
如果您需要等待,您可以将其包装到任务中(如您所说)或创建多个任务(使用WhenAll()
等待)。在第二种情况下:
var tasks Enumerable.Range(0, 10)
.Select(i => Task.Run(() => doSomething(i));
或者(如果您使用的是无参数的操作
委托):
为了并行执行任务
,您甚至可以编写更少的代码,因为您可以直接将它们用作WhenAll()
的参数。如果您有一个任务
,并且希望并行运行多次,那么您就很不走运,因为您无法恢复任务的操作,因此只能同步运行多次。您的第一个示例是:
Parallel.For(0, 10, _ => myAction());
Parallel.For()。更改代码以从数组调用委托或向其传递一个或多个参数是很简单的。举个例子:
Parallel.For(0, 10, i => myAction(i, somethingElse));
请注意,somethingElse
将被并发访问,因此它必须是线程安全的(至少用于读取)。如果不是,则必须在myAction
中处理同步(无论是方法还是委托)
如果您需要等待,您可以将其包装到任务中(如您所说)或创建多个任务(使用WhenAll()
等待)。在第二种情况下:
var tasks Enumerable.Range(0, 10)
.Select(i => Task.Run(() => doSomething(i));
或者(如果您使用的是无参数的操作
委托):
为了并行执行任务
,您甚至可以编写更少的代码,因为您可以直接将它们用作WhenAll()
的参数。如果您有一个任务
,并且希望并行运行多次,那么您就很不走运,因为您无法恢复任务的操作,因此只能同步运行多次。您的第一个示例是:
Parallel.For(0, 10, _ => myAction());
Parallel.For()。更改代码以从数组调用委托或向其传递一个或多个参数是很简单的。举个例子:
Parallel.For(0, 10, i => myAction(i, somethingElse));
请注意,somethingElse
将被并发访问,因此它必须是线程安全的(至少用于读取)。如果不是,则必须在myAction
中处理同步(无论是方法还是委托)
如果您需要等待,您可以将其包装到任务中(如您所说)或创建多个任务(使用WhenAll()
等待)。在第二种情况下:
var tasks Enumerable.Range(0, 10)
.Select(i => Task.Run(() => doSomething(i));
或者(如果您使用的是无参数的操作
委托):
为了并行执行任务
,您甚至可以编写更少的代码,因为您可以直接将它们用作WhenAll()
的参数。如果您有一个任务
,并且希望并行运行多次,那么您就很不走运,因为您无法恢复任务的操作,因此只能同步运行多次。您的第一个示例是:
Parallel.For(0, 10, _ => myAction());
Parallel.For()。更改代码以从数组调用委托或向其传递一个或多个参数是很简单的。举个例子:
Parallel.For(0, 10, i => myAction(i, somethingElse));
请注意,somethingElse
将被并发访问,因此它必须是线程安全的(至少用于读取)。如果不是,则必须在myAction
中处理同步(无论是方法还是委托)
如果您需要等待,您可以将其包装到任务中(如您所说)或创建多个任务(使用WhenAll()
等待)。在第二种情况下:
var tasks Enumerable.Range(0, 10)
.Select(i => Task.Run(() => doSomething(i));
或者(如果您使用的是无参数的操作
委托):
为了并行执行任务
,您甚至可以编写更少的代码,因为您可以直接将它们用作WhenAll()
的参数。如果你有一个任务并且你想并行运行它多次…你很不幸,因为你无法返回任务的动作,所以只能同步运行多次。你可以用等待任务.WhenAll(Enumerable.Range(1,10))之类的东西隐藏第一个选项的一些机制。选择(()=>Task.run)(myAction));
。在幕后,同样的工作量正在发生。@Damien\u不信者,它仍然会让你添加不必要的东西(IEnumerable