Równoległe wykonywanie zadań z async / it oczekuje

W kontekście akonsola aplikacja korzystająca zasync / await konstrukcje, chciałbym wiedzieć, czy możliwe jest, aby „kontynuacje” działały równolegle na wielu wątkach na różnych procesorach.

Myślę, że tak jest w przypadku, gdy kontynuacje są publikowane w domyślnym harmonogramie zadań (brak SynchronizationContext w aplikacji konsoli), która jest pulą wątków.

Wiem, że async / await construct nie konstruuje żadnego dodatkowego wątku. Nadal powinien istnieć co najmniej jeden wątek skonstruowany na CPU przez pulę wątków, a zatem jeśli kontynuacje są publikowane w puli wątków, może zaplanować kontynuowanie zadania równolegle na różnych procesorach ... tak myślałem, ale z jakiegoś powodu I wczoraj bardzo się zdezorientowałem i nie jestem już taki pewien.

Oto prosty kod:

public class AsyncTest
{
  int i;

  public async Task DoOpAsync()
  {
    await SomeOperationAsync();

    // Does the following code continuation can run 
    // in parrallel ?
    i++;       

    // some other continuation code ....
  }

  public void Start()
  {
    for (int i=0; i<1000; i++)
    { var _ = DoOpAsync(); } // dummy variable to bypass warning
  }
}

SomeOperationAsync nie tworzy w sobie żadnego wątku i powiedzmy na przykład, że wysyła on jakieś żądanie asynchronicznie, opierając się na porcie zakończenia we / wy, więc nie blokuje żadnego wątku.

Teraz, jeśli zadzwonięPoczątek metoda, która wyda 1000 operacji asynchronicznych, czy możliwe jest równoległe uruchomienie kodu kontynuacji metody asynchronicznej (po oczekiwaniu) na różnych wątkach procesora? tj. czy muszę w tym przypadku zadbać o synchronizację wątków i zsynchronizować dostęp do pola „i”?

questionAnswers(2)

yourAnswerToTheQuestion