Есть ли способ получить текущую запущенную задачу по идентификатору, как только вы выйдете из метода, в котором вы начали работу? Я хотел бы получить некоторые текущие задачи, чтобы я мог остановить некоторые из них в середине исполнения, не прерывая поток программы.C# выборки асинхронных задач
Например:
class Test
{
List<Task> listOfTasks = new List<Task>();
void taskCaller()
{
try
{
var myTask = Task.Factory.StartNew(()=> testMethod());
listOfTasks.Add(myTask);
}
catch (System.Exception)
{
//...
throw;
}
}
void taskGetter()
{
foreach (var item in listOfTasks)
{
if(item == something)
{
item.KillExecution();
}
}
}
private void testMethod()
{
// doing something
throw new NotImplementedException();
}
}
EDIT
Я хочу сделать это без отмены токенов, если это возможно, поскольку он не работает для меня, как я хочу, потому что я бегу выборку таймера DLL из DB и токены отмены работают только в том случае, если я немедленно убиваю задачу с token.Cancel()
, однако если я попробую token.CancelAfter()
, это не сработает, потому что оно запускается только после завершения задачи с исполнением, какой это не идея.
EDIT2:
Не копировать тонны кода, вот псевдо всего потока:
new timer(repeat method every xx time units)
open DB
do some work
save DB
Продолжая plast1k предложение ...
Когда я проверить словарь, если в этом сценарии требуется аннулирование, он говорит true
, но он ничего не делает для выполняемой задачи
private void getActiveTasks()
{
if (!ListOfTasks.Any())
return;
Console.WriteLine("Currently running:");
foreach (var task in ListOfTasks)
{
Console.WriteLine("\t" + task.Key);
Console.WriteLine("\t" + task.Value.MyTask.Id);
task.Value.Token.Cancel();
Console.WriteLine("\t" + task.Value.Token.IsCancellationRequested);
ListOfTasks.Remove(task.Key);
return;
}
}
Не пытаясь быть придурком, но если отмена лексемы не являются работая тогда, вы делаете что-то неправильно. Может быть, вы могли бы объяснить, почему они не работают? См. [Проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – Equalsk
Здесь я обновил его – Norgul
По-прежнему звучит так, будто вы неправильно используете маркеры отмены. Это совместное усилие, метод, который извлекает из БД, должен регулярно проверять, отменен ли переданный токен, и если он должен выйти из системы изящно. Не знаете, почему вы должны использовать CancelAfter over Cancel, особенно если вы хотите отменить как можно скорее? – Equalsk