Что делать с несколькими асинхронными вызовами методов в C # - PullRequest
0 голосов
/ 11 декабря 2018

Предположим, у меня есть простой класс с асинхронным методом:

public class Writer
{
    public Task WriteAsync(string message);
}

Это внутренний класс, который абсолютно незначителен для бизнес-логики приложения.

Основная идея метода заключается в том, что при его вызове - метод должен немедленно вернуть управление вызывающему методу , чтобы избежать любой возможной задержки в важном, полном бизнес-логики, вызывающем метод (Конечно, возможна задержка вызова этого метода).

Этот метод вызывается в разных местах, очень часто.и нам все равно, будет ли он успешным или не напишет последние сообщения в случае непредвиденной ситуации.Это нормально.

Итак, вопрос в том, как мне позвонить WriteAsync, чтобы избежать возможных задержек при вызове метода ?

Я думал о Task.Run(() => WriteAsync(message)) (без await! нам не нужно ждать этого!), но разве это не заполнит мой пул потоков бесполезной работой?И повсеместно писать такой код повсеместно ...

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Поскольку метод является асинхронным, то по определению он уже немедленно возвращает управление вызывающей стороне.Если реализация этого метода на самом деле не асинхронная, то он не должен либо возвращать Task, не иметь Async в имени и давать понять вызывающим, что он синхронный, либо должен исправитьошибка в его реализации , из-за которой он блокировал вызывающего на длительный период времени.Вызывающие метод будут по праву ожидать, что, будучи асинхронным методом, он вернет управление вызывающей стороне немедленно , просто вызвав метод в обычном режиме.Если в методе есть ошибка, из-за которой он этого не делает, вы не должны обходить эту ошибку и вызывать вызывающие его обработчики как синхронный метод, когда он утверждает, что это не так.

0 голосов
/ 11 декабря 2018

Вы можете поставить в очередь записи и обработать очередь, т.е. выполнить запись, в выделенном фоновом потоке.Это то, что происходит, когда вы вызываете Task.Run, то есть вы ставите делегатов в очередь в пул потоков.Если вам требуется больше контроля, вы можете, например, использовать BlockingCollection<T>.

. Существует пример того, как использовать BlockingCollection<T> для чтения и записи элементов, одновременно доступных на MSDN .

При таком подходе вызов WriteAsync блокирует только время, необходимое для добавления сообщения в очередь, и это время должно быть незначительным.

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