У меня есть событие щелчка на сервере на веб-сайте ASP.NET WebForms. В этом случае я вызываю метод, который, в свою очередь, вызывает его метод асинхронного партнера, добавляя .Wait()
к вызову.Разница между вызовом .Wait() для метода async и Task.Run(). Wait()
Этот метод затем проходит несколько уровней вниз (т.е. , вызывает другой метод асинхронного, который вызывает другой метод асинхронного, и так далее) и в конечном итоге вызывает метод асинхронного на качестве HttpClient объекта. В этот момент нить, кажется, исчезает по кроличьей дыре; метод никогда не перезванивает.
Теперь я знаю, что асинхронная серия вызовов работает так, как ожидалось, потому что тот же код также вызывается из контроллера веб-API (метод контроллера вызывает асинхронную версию этого первого метода, а не синхронный «партнерский» метод) , который полностью асинхронный, и он возвращается, как ожидалось.
Так в основном у меня есть что-то вроде этого, который никогда не возвращает
protected void btn_Click(object sender, EventArgs e)
> Class1.DoSomething()
> Class1.DoSomethingAsync.Wait()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync() // never returns
}
Я попытался с помощью .ConfigureAwait(false)
на этом первом методе асинхронным, но без какого-либо успеха.
У меня также есть это, что делает возвращение
Task<IHttpActionResult> MyWebApiMethod()
> await Class1.DoSomethingAsync()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync() // does return
}
Я обнаружил, что я могу сделать первую версию работы, если я могу изменить его на следующее:
protected void btn_Click(object sender, EventArgs e)
> Class1.DoSomething()
> Task.Run(async() => await Class1.DoSomethingAsync()).Wait()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync()
}
Но я не знаю почему.
Может кто-нибудь объяснить разницу между вызовом
Class1.DoSomethingAsync.Wait()
и вызова
Task.Run(async() => await Class1.DoSomethingAsync()).Wait()
Почему бы вам не использовать его правильным способом. 'async void btn_Click' и' await Class1.DoSomethingAsync() '? – user3185569
Не используйте 'Task.Run' с уже асинхронными методами, это отходы потоков. Просто измените подпись обработчика событий 'button_click', поскольку @ user3185569 предложил – Fabio
@ user3185569 - Я не использовал это, потому что я не знал, что я использую' async' на событиях WebForms на стороне сервера. Спасибо, что указали на это. – awj