我有一种情况(对或错),我可能需要放弃一个正在运行的Task实例并启动一个新任务。取消不是一种选择,因为这几乎是遗留代码,需要花费大量精力来支持传递取消令牌。我的意思是这样的
public Task TaskUnderObservation{get; private set;}
public async Task WatchTaskInternal(Func<Task<TResult>> task)
{
try
{
if (TaskUnderObservation != null) //basically if we are re-using this instance of class
ResetCommonTaskState();
TaskUnderObservation = task(); //Task is defined as a class level variable of type Task
LogManager.Instance.Info(this, "Started Task");
await Task;
}
catch (Exception ex)
{
LogManager.Instance.Error(this, "WatchTaskInternal Errored", ex);
}
}
问题是运行的TaskUnderObservation会发生什么样的方法,重复调用WatchTaskInternal方法。
var x = new TaskWatcherClass();
x.WatchTaskInternal (//some Func);
x.WatchTaskInternal (//some other FUNC);
我的运行任务会被放弃或忽略吗?如果我有一个WPF应用程序绑定到我的TaskUnderObservation对象的结果,它会将它绑定到第一次调用的结果或最近的调用吗?
答案 0 :(得分:4)
您无法放弃运行代码。正在运行的代码必须是同谋,因此支持某种取消。
您可以通过简单地删除对该任务的引用来放弃该任务,但正在运行的代码将运行完成。
不要试图使用Thread.Abort
。这是纯粹的邪恶。