Блокировка сбора в фоновом рабочем процессе не запускает неожиданные задачиC#

Место общения программистов C#
Anonymous
Блокировка сбора в фоновом рабочем процессе не запускает неожиданные задачи

Сообщение Anonymous »


У меня есть потребитель, пользовательский фоновый рабочий процесс, использующий BlockingCollection, подобный этому

публичный класс PCQueue: IDisposable { BlockingCollection _taskQ = new BlockingCollection(); общественный PCQueue () { Task.Factory.StartNew (Consume); } общественный недействительный Dispose () { _taskQ.CompleteAdding (); } public TaskCompletionSource EnqueueTask (действие Func) { var завершение = новый TaskCompletionSource(); _taskQ.Add (() => завершение.TrySetResult(действие())); завершение возврата; // Возможно, сюда нужно вернуть задачу } void Consume() { foreach (Действие в _taskQ.GetConsumingEnumerable()) action(); } } Проблема в том, что блокирующий сбор не переходит к следующей задаче в очереди, если задача не ожидается. Другими словами, функция «выстрелил и забыл» не работает. В приведенном ниже коде второй вызов застревает в очереди до тех пор, пока не будет ожидан следующий.

public static async Task Main() { // Это напечатает «Начало» вар originalScheduler = InstanceService.Instance; await originalScheduler.Send(() => Console.WriteLine("Start")).Task; // Если не ждать, ничего не напечатается originalScheduler.Send(() => Console.WriteLine("Продолжить")); // Это напечатает два последних сообщения: «Продолжить» и «Завершить». ожидайте originalScheduler.Send(() => Console.WriteLine("Завершено")).Task; } Вопрос

Сейчас работник позволяет дождаться задачи в очереди или отменить работу. Как я могу гарантировать, что задача будет выполнена даже без ожидания, по принципу «выстрелил и забыл»?

Вернуться в «C#»