TransformBlock之后如何写入对象? - c#

我有一个需要迭代并行处理的对象的列表。这是我需要做的:

foreach (var r in results)
{
    r.SomeList = await apiHelper.Get(r.Id);
}

由于我想对其进行parellelize,因此我尝试使用Parallel.ForEach(),但它没有等到所有事情都完成之后才开始使用
apiHelper.Get()正在自己内部进行等待。

Parallel.ForEach(
                results,
                async (r) =>
                {
                    r.SomeList = await apiHelper.Get(r.Id);
                });

所以我在网上搜索后发现:
Nesting await in Parallel.ForEach

现在我对TPL非常陌生(20分钟大),我可能会遗漏一些明显的东西。我该如何进行?

        var getBlock = new TransformBlock<string, List<Something>>(
            async i =>
            {
                var c = await apiHelper.Get(i);
                return c;
            }, new ExecutionDataflowBlockOptions
            {
                MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded
            });

        foreach (var r in results)
        {
            r.SomeList = getBlock.Post(r.Id);  // ERROR: Can't convert boolean to list.
        }

        getBlock.Complete();

参考方案

这是在ActionBlock Class库中使用TPL dataflow的示例。

它基本上为您提供了并行,并且async及其相当容易理解

数据流示例

public static async Task DoWorkLoads(List<Something> results)
{
   var options = new ExecutionDataflowBlockOptions
                     {
                        MaxDegreeOfParallelism = 50
                     };

   var block = new ActionBlock<Something>(MyMethodAsync, options);

   foreach (var result in results)
      block.Post(result );

   block.Complete();
   await block.Completion;

}

...

public async Task MyMethodAsync(Something result)
{       
   result.SomeList = await apiHelper.Get(result.Id);
}

显然,您需要进行错误检查,并添加胡椒粉和盐调味

另外,假设apiHelper是线程安全的

多重处理:map与map_async - python

使用map和map_async有什么区别?将列表中的项目分配给4个进程后,它们是否运行相同的功能?因此,假设两者都在异步和并行运行是错误的吗?def f(x): return 2*x p=Pool(4) l=[1,2,3,4] out1=p.map(f,l) #vs out2=p.map_async(f,l) python大神给出的解决方案 将作业映射到流程…

等待异步方法中已完成的任务 - c#

当我们调用异步方法时,我们返回一个包装器任务。public async Task ExecuteActionAsync() { // no await called } public async Task ExecuteActionAwaitAsync() { // await called on a completed await Task.Complet…

简便的方法来等待已取消的任务? - c#

我发现自己经常这样编写代码:try { cancellationTokenSource.Cancel(); await task.ConfigureAwait(false); // this is the task that was cancelled } catch(OperationCanceledException) { // Cancellation…

了解C#等待运算符 - c#

我只是对C#的异步编程有一些基本的了解。据我了解,这段代码statement1; await statement2(); statement3; statement4; 在逻辑上应等效于statement1; var awaiter = statement2().GetAwaiter(); awaiter.OnCompletion(() => { aw…

等待Task.CompletedTask是否意味着async方法将同步运行? - c#

static async Task WaitTaskCompleted() { //Use Thread A before await Task.CompletedTask await Task.CompletedTask; //Will the code after await Task.CompletedTask always use Thread A,…