#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 выполняются без головной боли, связанной с возвратом резервуаров и ожиданием их разрешения во всех нужных местах, что значительно упрощает вашу жизнь.