2016-09-21 118 views
2

类别TaskHolder有一个属性类型Task。我将Task作为参数传递给构造函数,并立即启动。有没有办法阻止它开始?阻止启动任务

public class Worker 
{ 
    public class TaskHolder 
    { 
     public TaskHolder(Task objective) 
     { 
      Objective = objective; 
     } 

     public Task Objective { get; set; } 
    } 

    public async Task DoSomething() 
    { 
     await Task.Delay(5000); 
     Debugger.Break(); // Task starts, so debugger stops here! 
     // Is there a way to prevent it from start? 
    } 

    [Test] 
    public async Task TempTest() 
    { 
     // programm starts here: 
     var t1 = new TaskHolder(DoSomething()); 
     await Task.Delay(10000); 
    } 
} 
+0

我可以问你为什么不要它开始?这是为了调试吗? – GrandMasterFlush

+0

'实际代码中的'TaskHolder'有'List Steps {get;设置;}',它拥有多个步骤来逐个执行,而不是同时执行。我想定期执行这个步骤。现在我看到我的实现是错误的。 B.t.w.第一次运行后,步骤变成了“RanToCompletion”状态,因此再次启动它们的唯一方法是重新创建它们。 – AsValeO

+1

“'列表步骤{get; set;}'拥有多个步骤来逐个执行,而不是同时执行” - 这根本不是“Task”所代表的。这听起来应该是'List ' –

回答

4

A Task表示等待操作的现在或未来结果。如果该任务已经开始,那很有趣 - 但它与代码收到任务无关。

如果您还不想开始某些事情,那么您应该通过Action。您可以通过Task.RunAction创建Task。或者你可以简单地通过action()或action.Invoke()调用动作。

如果你想运行的是明确异步的:你可以通过Func<Task>。再次,如果您想要代表最终状态的Task,您可以使用Task.Run开始此类代表。或者你可以调用它。

(是否Invoke()它或把它传给Task.Run()取决于你是否希望它使用线程任之)

最后,当你叫DoSomething()开始运行的代码。计时器由Task.Delay安排,然后代码继续到TaskHolder

+0

所以用简单的话来说。如果我创建一个Task实例,它可以立即启动,我无法控制它。为什么'新的Task()'是这个规则的例外呢? – AsValeO

+1

@AsValeO不,这不是什么意思;它比这更微妙。在这种情况下,你得到的'Task'是**你开始**的'async'方法的结果。还有其他类型的“任务”。例如,如果您使用'TaskCompletionSource ',那么可以将'.Task'提交给人员,并且根本不会执行任何操作。但它也不代表将来可运行的操作!你需要单独的代码(可能是一个IO回调)来触发完成状态('TrySetResult'等)。再说一遍:正确的使用取决于你想要做什么 - 在你的例子中不清楚的东西。 –

+0

你已经帮了我很多了! – AsValeO