【发布时间】:2016-10-28 20:15:43
【问题描述】:
一旦退出最初启动任务的方法,有没有办法通过 ID 获取当前正在运行的任务?我想以某种方式获取当前任务,这样我就可以在执行过程中停止其中一些任务,而不会中断程序的流程。
例如:
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();
}
}
编辑
如果可能的话,我希望它在没有取消令牌的情况下完成,因为它不适合我,因为我正在运行一个从数据库获取 DLL 的计时器,并且取消令牌只有在我立即使用 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;
}
}
【问题讨论】:
-
不要试图成为一个混蛋,但如果取消令牌不起作用,那么你做错了什么。也许您可以解释为什么它们不起作用?见the XY problem。
-
这里,我已经更新了
-
听起来您仍然错误地实现了取消令牌。这是一个合作的努力,从数据库中获取的方法应该定期检查传入的令牌是否已被取消,如果它有,该方法应该正常退出。不确定为什么要使用 CancelAfter 而不是 Cancel,尤其是在您想尽快取消的情况下?
-
我不...我希望它在超时后终止
-
没有区别,当您要求取消方法时,它要么已经从数据库中获取,要么不是,如果您在此之前和之后检查取消令牌,它仍然会正常退出.如果您要求强制轰炸该方法,那么这是一个坏主意,令牌以这种方式实现是有原因的。
标签: c# asynchronous task