簡體   English   中英

為什么異步LINQ Select lambda不需要返回值

[英]Why doesn't an async LINQ Select lambda require a return value

我正在閱讀Stephen Cleary的Concurrency in C#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");
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM