Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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# “表格”中是否有一些内置方法;同时等待RunManyTimes(numberOfTimes,myAction)“;? TL/DR:_C#_Task Parallel Library_Async Await - Fatal编程技术网

C# “表格”中是否有一些内置方法;同时等待RunManyTimes(numberOfTimes,myAction)“;? TL/DR:

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

我想知道是否有一种“c#内置优雅方式”并行运行
任务
/
操作
多次,比如:

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