Статья .Net on Tasks показывает два следующих фрагмента кода, один с использованием await, а другой с использованием Task.Wait, и говорит, что оба они «функционально эквивалентны».

Разве это не технически некорректно? Может кто-нибудь уточнить?

Кроме того, если предполагается, что задачи должны быть асинхронными и образуют основу для асинхронного программирования (TPL), почему ASP.Net все равно разрешает синхронное ожидание для них? Разве это не нарушает их основную полезность?

using System;
using System.Threading.Tasks;

public class Example
{
   public static async Task Main()
   {
      await Task.Run( () => {
                                  // Just loop.
                                  int ctr = 0;
                                  for (ctr = 0; ctr <= 1000000; ctr++)
                                  {}
                                  Console.WriteLine("Finished {0} loop iterations",
                                                    ctr);
                               } );
   }
}
// The example displays the following output:
//        Finished 1000001 loop iterations
using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task t = Task.Factory.StartNew( () => {
                                  // Just loop.
                                  int ctr = 0;
                                  for (ctr = 0; ctr <= 1000000; ctr++)
                                  {}
                                  Console.WriteLine("Finished {0} loop iterations",
                                                    ctr);
                               } );
      t.Wait();
   }
}
// The example displays the following output:
//        Finished 1000001 loop iterations

Статья должна четко объяснять различия между двумя вызовами.

1
Ayushmati 6 Дек 2018 в 17:51

1 ответ

Лучший ответ

Разве это не технически некорректно?

Нет, потому что он очень конкретен. Это не означает, что написание метода async, ожидающего задачу, всегда то же самое, что просто синхронное ожидание этой задачи, это только относится к очень специфическому случаю метода async Main в качестве точки входа для приложения. Когда вы создаете метод Main async, он просто синхронно ожидает возвращенной задачи, что делает его функционально эквивалентным просто синхронному ожиданию задачи внутри метода вместо того, чтобы делать метод async < em> только в одной конкретной ситуации .

(Вы также можете привести аргумент, что он просто пытается сказать, что StartNew с предоставленными параметрами и Run эквивалентны, и не намеревается ссылаться на разницу между асинхронным и синхронным ожиданием .)

почему в любом случае ASP.Net разрешает синхронное ожидание для них?

Task не был создан исключительно для представления работы, выполняемой асинхронно. Он был разработан для этого , а также для синхронной работы в параллельном режиме с использованием нескольких потоков. Когда вы используете задачи для асинхронности, вы никогда не должны использовать Wait или другой синхронный механизм блокировки, но если вы используете его для синхронной многопоточной работы, это полезно. Вы могли бы привести [хороший] аргумент, что они должны были сохранить эти концепции отдельно, но они этого не сделали, и уже слишком поздно менять это сейчас.

Разве это не нарушает их основную полезность?

Да, да, это так. Вот почему я не фанат этой реализации и предпочел бы, чтобы они реализовали ее по-другому. Но они этого не сделали.

Статья должна четко объяснять различия между двумя вызовами.

Да, должно.

4
Servy 6 Дек 2018 в 15:19