Блокировка сбора в фоновом рабочем процессе не запускает неожиданные задачи ⇐ C#
Блокировка сбора в фоновом рабочем процессе не запускает неожиданные задачи
У меня есть потребитель, пользовательский фоновый рабочий процесс, использующий 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; } Вопрос
Сейчас работник позволяет дождаться задачи в очереди или отменить работу. Как я могу гарантировать, что задача будет выполнена даже без ожидания, по принципу «выстрелил и забыл»?
У меня есть потребитель, пользовательский фоновый рабочий процесс, использующий 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; } Вопрос
Сейчас работник позволяет дождаться задачи в очереди или отменить работу. Как я могу гарантировать, что задача будет выполнена даже без ожидания, по принципу «выстрелил и забыл»?
Re: Блокировка сбора в фоновом рабочем процессе не запускает неожиданные задачи
Тоже интересует этот вопрос
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Ошибка HTTP 500.35 - множественные приложения ANCM в процессе в том же процессе ASP.NET Core 3
Anonymous » » в форуме C# - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Ошибка HTTP 500.35 - множественные приложения ANCM в процессе в том же процессе ASP.NET Core 3
Anonymous » » в форуме C# - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-