Разница между join и await в потоке

#c# #asp.net #multithreading #thread-safety

#c# #asp.net #многопоточность #потокобезопасность

Вопрос:

Join : блокирует вызывающий поток до тех пор, пока поток не завершится

await : приостановить выполнение метода до завершения ожидаемой задачи

В чем еще разница между join и await.

Кто-нибудь может мне помочь, когда мы можем использовать join и когда мы можем использовать await?

Спасибо, HItesh

Ответ №1:

Join и await совершенно разные. В самых простых и широких терминах Join — это старый способ выполнения потоков, await — это новый способ. Если когда-нибудь возникнут сомнения, используйте await и избавьте себя от большой головной боли.

Чтобы углубиться в подробности, если вы вручную создаете поток с помощью var thread = new Thread(MyRunMethod); thread.Start() (или чего-то подобного) и хотите дождаться завершения этого метода, вам нужно будет вызвать thread.Join() его позже, если вы хотите дождаться его завершения, прежде чем продолжить работу с вашей программой. В этом сценарии, если вы хотите получить результаты от функции, вам нужно будет убедиться, что вы сами справляетесь с синхронизацией потоков и устанавливаете блокировки во всех нужных местах, чтобы позже не пришлось читать частичные данные.

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

 public async Task<String> GetGoogle()
{
    var result = await new WebClient().DownoadString("http://www.google.com");
    return resu<
}

public void Main()
{
    Console.WriteLine(GetGoogle().Result);
}
  

Другим важным отличием является этот поток.Join заблокирует поток, в котором вы это вызываете (потребляя некоторые ресурсы), пока он ожидает. С помощью await ... вы освобождаете текущий поток для выполнения других действий, пока ждете завершения.

Комментарии:

1. если основной поток не заблокирован, то оператор return будет выполнен, не так ли?

2. Он возвращает немедленно, но возвращает a, Task который в конечном итоге решается с помощью result . Асинхронные операции / await выполняются без головной боли, связанной с возвратом резервуаров и ожиданием их разрешения во всех нужных местах, что значительно упрощает вашу жизнь.