c# - 为什么异步 LINQ Select lambda 不需要返回值

标签 c# linq asynchronous select

我正在阅读 Stephen Cleary 的 Concurrency in C#,其中有一个让我困惑了一段时间的例子。

通常,LINQ Select 方法需要一个返回结果集合值的 lambda 方法。

在第 30 页的书中有一个 lambda 不返回任何内容的示例,但是代码编译并运行良好:

static async Task<int> DelayAndReturnAsync(int val)
{
   await Task.Delay(TimeSpan.FromSeconds(val));
   return val;
}

static async Task ProcessTasksAsync()
{
   // Create a sequence of tasks
   Task<int> taskA = DelayAndReturnAsync(2);
   Task<int> taskB = DelayAndReturnAsync(3);
   Task<int> taskC = DelayAndReturnAsync(1);

   var tasks = new[] { taskA, taskB, taskC };

   var processingTasks = tasks.Select(async t => 
   {
      var result = await t;
      Trace.WriteLine(result);
      // Note: nothing is returned
   }).ToArray();

   // Await all processing to complete
   await Task.WhenAll(processingTasks);
}

// Outputs:
// 1
// 2
// 3

问题是关于这部分的:

var processingTasks = tasks.Select(async t => 
   {
      var result = await t;
      Trace.WriteLine(result);
      // Note: nothing is returned
   }).ToArray();

这是为什么?这是推荐的方法吗?

更新:

此行为记录在何处?

最佳答案

这就像写一个不返回值的异步方法,但是使用一个Task来指示完成:

public async Task FooAsync()
{
    Console.WriteLine("Before");
    await Task.Delay(1000);
    Console.WriteLine("After");
}

作为异步匿名函数,这将是:

Func<Task> foo = async () =>
{
    Console.WriteLine("Before");
    await Task.Delay(1000);
    Console.WriteLine("After");
};

关于c# - 为什么异步 LINQ Select lambda 不需要返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889602/

相关文章:

Python Tornado - 异步请求正在阻塞

C# MySQL 简单成员提供程序

c# - 获取字节数组而不是将字节数组保存为文件

c# - 如何检查一个字符串是否不等于所有这些?

c# - 使用 groupby、sum 和 count 将 SQL 转换为 Linq

javascript - 错误 : Callback was already called when using pg-promise with async series

c# - MVVM 将嵌套 subview 连接到 subview 模型

C# BinaryWrite 通过 SSL

C# - 如何使用 LINQ to Objects 创建不可变对象(immutable对象)

python - Asyncio执行流程问题