У меня есть приложение WPF, в котором я генерирую номера задач для параллельной обработки. Теперь, когда мое состояние становится истинным, мне нужно отменить эту задачу. Когда я применяю CancellationTokenSource для отмены задачи, тогда она отменяет всю группу задач, но мне нужно отменить только одну.
Task t1 = Task.Run(() => Task.Delay(30000, token), token);
test.Add(t1.Id, symbolName);
lstTask.Add(t1);
await t1;
здесь я держу идентификатор задачи, чтобы я мог знать, какую задачу мне следует отменить?
Так, пожалуйста, вы можете предложить мне, как я могу отменить только одну задачу по ее идентификатору?
После обсуждения проблемы я внес в код некоторые изменения, поэтому, пожалуйста, предложите мне изменить мою логику? потому что недавно я знал, что идентификатор задачи не уникален, поэтому я предпочитаю CTS напрямую.
public static async void startAddToPosition(System.Threading.CancellationTokenSource cts1, string symbolName)
{
try
{
Task t1 = Task.Run(() => Task.Delay(30000, cts1.Token), cts1.Token);
test.Add(symbolName, cts1);
lstTask.Add(t1);
lstCts.Add(cts1);
await t1;
generateRealPosition("QQQ"); //here I need symbol name when task will complete it's 30 seconds.
}
catch (OperationCanceledException ex)
{
var symbolName = test.FirstOrDefault(q => q.Value.Token == ex.CancellationToken).Key;
}
}
однако, с другой стороны, когда условие становится полным, тогда я пытаюсь отменить задачу, как показано ниже:
CancellationTokenSource cts = Evaluation.parallelScripts.test.FirstOrDefault(q => q.Key == eventData.symbolName).Value;
cts.Cancel();
Поэтому я пытаюсь получить CancellationTokenSource для определенного символа из списка и отменяю этот CTS. Так что эта задача стала отменой.
Так что мой вопрос в том, что я не знаю, является ли токен CTS уникальным или нет. потому что, когда CTS отменяет задачу, тогда в исключении мне нужно имя символа в соответствии с этим токеном CTS.