如果我覆盖正在运行的Task实例怎么办?

时间:2014-09-24 03:41:34

标签: c# wpf task-parallel-library

我有一种情况(对或错),我可能需要放弃一个正在运行的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对象的结果,它会将它绑定到第一次调用的结果或最近的调用吗?

1 个答案:

答案 0 :(得分:4)

您无法放弃运行代码。正在运行的代码必须是同谋,因此支持某种取消。

您可以通过简单地删除对该任务的引用来放弃该任务,但正在运行的代码将运行完成。

不要试图使用Thread.Abort。这是纯粹的邪恶。