Блокировка сбора в фоновом рабочем процессе не запускает неожиданные задачи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; } Вопрос

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

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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