Асинхронный метод c в веб-форме ASP. NET - PullRequest
0 голосов
/ 28 мая 2020

Мне нужно использовать стороннюю библиотеку в приложении ASP. NET веб-форм.

Сторонний метод, который я должен использовать, - asyn c.

Поскольку я должен вызывать его в обработчике события щелчка страницы, у меня есть 2 варианта:

  1. Объявить каждую страницу, которая должна использовать этот метод, как <% @ Page Async = "true" ...%>
  2. Вызов метода синхронно.

ПЕРВЫЙ ВОПРОС

Есть ли смысл объявлять все страницы сайта асинхронными c только для этого метода (потенциально может быть вызван на каждой странице)?

ВТОРОЙ ВОПРОС

Второй вопрос касается синхронного вызова метода asyn c .

Необходимость вызывать следующий метод

async Task<bool> MyMethodAsync()
{
    ...
}

В чем разница между следующими тремя вызовами?

Task.Run(async () => await MyMethodAsync()).GetAwaiter().GetResult();
Task.Run(() => MyMethodAsync()).GetAwaiter().GetResult();
MyMethodAsync().GetAwaiter().GetResult();

Я не вижу никакой разницы во время выполнения ...

Спасибо!

1 Ответ

1 голос
/ 28 мая 2020

Task.Run(async () => await MyMethodAsync()).GetAwaiter().GetResult();

Это запускает задачу для выполнения в потоке пула потоков, который запускает метод асинхронно. Затем основной поток сидит там и ожидает завершения задачи потока threadpool sh.

Task.Run(() => MyMethodAsync()).GetAwaiter().GetResult();

Это то же самое, что и выше, но основной функция "продолжается" до полного завершения метода.

MyMethodAsync().GetAwaiter().GetResult();

Это, по крайней мере, позволяет избежать использования лишнего потока для остановки основного потока.

Изменить: я не видел этого вопроса:

Имеет ли смысл объявлять все страницы веб-сайта asyn c только для этого метода (потенциально может быть вызван на каждом страница)?

Зависит от какого async. Если они все равно вернут void, вы ничего не получите, вы просто нарушите свою кодовую базу. Если вы возвращаете реальный Task, то обязательно. На самом деле так работает ASP. Net Core.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...