Использование Task.Wait вместо await для асинхронного программирования - PullRequest
0 голосов
/ 06 декабря 2018

В статье .Net о задачах показаны два следующих двух фрагмента кода, один с использованием 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 Ответ

0 голосов
/ 06 декабря 2018

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

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

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

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

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

Разве это не нарушает ихОсновная утилита?

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

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

Да, так и должно быть.

...