阻止启动任务
类别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);
}
}
A Task
表示等待操作的现在或未来结果。如果该任务已经开始,那很有趣 - 但它与代码收到任务无关。
如果您还不想开始某些事情,那么您应该通过Action
。您可以通过Task.Run
从Action
创建Task
。或者你可以简单地通过action()
或action.Invoke()调用动作。
如果你想运行的是明确异步的:你可以通过Func<Task>
。再次,如果您想要代表最终状态的Task
,您可以使用Task.Run
开始此类代表。或者你可以调用它。
(是否Invoke()
它或把它传给Task.Run()
取决于你是否希望它使用线程任之)
最后,当你叫DoSomething()
,你开始运行的代码。计时器由Task.Delay
安排,然后代码继续到TaskHolder
。
所以用简单的话来说。如果我创建一个Task实例,它可以立即启动,我无法控制它。为什么'新的Task()'是这个规则的例外呢? – AsValeO
@AsValeO不,这不是什么意思;它比这更微妙。在这种情况下,你得到的'Task'是**你开始**的'async'方法的结果。还有其他类型的“任务”。例如,如果您使用'TaskCompletionSource
你已经帮了我很多了! – AsValeO
我可以问你为什么不要它开始?这是为了调试吗? – GrandMasterFlush
'实际代码中的'TaskHolder'有'List Steps {get;设置;}',它拥有多个步骤来逐个执行,而不是同时执行。我想定期执行这个步骤。现在我看到我的实现是错误的。 B.t.w.第一次运行后,步骤变成了“RanToCompletion”状态,因此再次启动它们的唯一方法是重新创建它们。 –
AsValeO
“'列表步骤{get; set;}'拥有多个步骤来逐个执行,而不是同时执行” - 这根本不是“Task”所代表的。这听起来应该是'List ' –