2015-06-20 75 views
0

给定一个Task实例,如何判断是否已调用ContinueWith?我想知道我是否是链中执行的最后一项任务。,我可以告诉它是否已经调用了ContinueWith?

Task task = Task.FromResult(); 
void SomeMethod(var x) { 
    task = task.ContinueWith(previous => { 
     if (task.ContinueWith is called) return; 
     // do something with x... 
    } 
} 
+0

我不知道如何在一般情况下有帮助。 “ContinueWith”可能不是最后一个。 –

+0

@JohnSaunders,我不确定我是否理解你的陈述。也许我的例子太蹩脚了。我对创建三个任务的场景感兴趣。第一个完成,因为它开始。第二个(以及所有中间任务)被跳过,因为第三个在第一个完成之前被添加。 – Brannon

+1

也许你的实际问题更好的例子会更有意义。 –

回答

-1

你可以有一个静态变量(字典对象)宣布对家长和独特的键值更新当你的任务被触发。您可以监视此静态变量,以查看是否所有其他线程都已完成执行。

+0

想象一下我的软件运行很长时间。我不知道什么时候所有的任务都完成了,因为它是无法量化的。我只想跳过不是最近请求的任务。 – Brannon

+0

想想更多,但是,也许我所需要的是某种增量变量,在调用ContinueWith之前增量,然后与执行中的本地副本进行比较。 – Brannon

+0

是的,这应该工作。否则,很难跟踪信息,因为每个任务都是相互独立运行的 – Martin

0

如果你的意思是多个延续。一个可能的解决方案可能是这样的。

class Program 
    { 
     public class TaskState 
     { 
      public bool Ended { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      var task = Task.FromResult("Stackoverflow"); 
      var state = new TaskState(); 
      task.ContinueWith((result, continuationState) => 
      { 
       Console.WriteLine("in first"); 


      }, state).ContinueWith((result, continuationState) => 
      { 
       if (!state.Ended) 
        Console.WriteLine("in second"); 
       state.Ended = true; 

      }, state).ContinueWith((result, continuationState) => 
      { 
       if (!state.Ended) 
        Console.WriteLine("in third"); 
       state.Ended = true; 

      }, state); 
      Console.ReadLine(); 
     } 

    } 
相关问题