В функции CheckForCancellationAsync я только проверяю, отменено ли задание или нет. Если оно отменено, я выдаю ошибку с помощью ThrowIfCancellationRequested() и останавливаю процесс.
Для этого я проверяю рабочий метод задания и метод управления отменой с помощью Task.WhenAny.
В Task.WhenAny функция CheckForCancellationAsync завершает процесс Task.WhenAny после отмены задания. Однако метод задания продолжает работать.
Почему Task.WhenAny не завершает все процессы?
Я не хочу добавлять проверки типа ThrowIfCancellationRequested() между кодами в методе Джоба. Как я могу завершить процессы с помощью центрального элемента управления, такого как Task.WhenAny?
using Hangfire;
using System;
using System.Threading;
using System.Threading.Tasks;
public class JobRunner
{
public static async Task RunAsync(Func job, IJobCancellationToken jobCancellationToken)
{
using (var cts = new CancellationTokenSource())
{
var cancellationToken = cts.Token;
var cancellationTask = jobCancellationToken.CheckForCancellationAsync(cancellationToken);
try
{
var jobTask = job(cancellationToken);
var completedTask = await Task.WhenAny(jobTask, cancellationTask);
if (completedTask == cancellationTask)
{
// If the cancellation task completed first, cancel the job task
cts.Cancel();
jobCancellationToken.ThrowIfCancellationRequested();
cancellationToken.ThrowIfCancellationRequested();
}
await jobTask; // Ensure the job completes if it wasn't cancelled
}
catch (OperationCanceledException)
{
Console.WriteLine("Job was cancelled.");
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... ngfire-job
Task.WhenAny и отмена задания Hangfire ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему вызов неоднозначен между Task.Run
(Func ) и Task.Run(Func ) при передаче имени метода
Anonymous » » в форуме C# - 0 Ответы
- 100 Просмотры
-
Последнее сообщение Anonymous
-