等待新任务(…):任务不运行?

这里问的一个问题的延续:

在前面提到的问题中,我有以下函数返回Task类型的对象(用于增量测试目的):

private static Task GetInstance( ) { return new Task( (Func<Task>)(async ( ) => { await SimpleMessage.ShowAsync( "TEST" ); return new object( ); } ) ); } 

当我调用await GetInstance( ); ,函数被调用(我假设任务被返回,因为没有抛出exception),但随后任务就在那里。

我只能猜测我做错了。

我不希望此函数返回已在运行的任务(即IMPERATIVE )。

如何异步运行此函数返回的任务?

创建任务已经开始

尝试创建这样的任务:

 Task.Factory.StartNew((Func>) ...); 

在不启动任务的情况下创建任务

如果您不希望任务启动,只需使用new Task(...) ,但是在等待它之前需要在该任务上调用Start()方法!

[参考]

我的推荐

只需创建一个返回匿名函数的方法,如下所示:

 private static Func GetFunction( ) { return (Func)(( ) => { SimpleMessage.Show( "TEST" ); return new object( ); } ); } 

然后获取它并在需要时在新的Task运行它(还要注意我从lambda表达式中删除了async/await ,因为你已经将它放入一个Task中了):

 Task.Factory.StartNew(GetFunction()); 

这样做的一个优点是你也可以在不将它放入Task情况下调用它:

 GetFunction()(); 

你在那里遇到了糟糕的设计。 在这些限制条件下,我会尝试让一些东西适合你。

延迟启动任务的唯一方法是使用Task.Start方法。 (您也可以使用RunSynchronously但实际上并没有使用任何任务function。此时任务变为无线的懒惰对象。

所以使用Task.Start方法。

await不会启动任务。 它等待已经运行的任务。 因此await new Task(() => { })总是永远冻结。

另一个问题是:

 return new Task( (Func>)(async ( ) => { await SimpleMessage.ShowAsync( "TEST" ); return new object( ); } ) ); 

当你启动该任务时,它几乎会立即完成, Task.Result将执行另一项任务 – 异步lambda返回的任务。 我怀疑这是你想要的。 很难做到这一点,我不知道你需要什么。

这有点像XY问题。 你能详细说明你想要完成的事情吗? 感觉就像你给了自己不必要的限制。

您永远不应该使用Task构造函数(或Task.Start )。

我不希望此函数返回已在运行的任务(即IMPERATIVE)。

那么,您想要返回一些在您调用之前不会执行的代码吗? 那是代表,而不是Task

 private static Func> GetInstance() { return async () => { await SimpleMessage.ShowAsync("TEST"); return new object(); }; } 

当您准备好执行它时,就像任何其他委托一样调用它。 请注意,它返回一个Task ,因此您可以await结果:

 var func = GetInstance(); // Delegate has not started executing yet var task = func(); // Delegate has started executing var result = await task; // Delegate is done 

好吧,我想我已经弄明白了。 请检查此代码:

 class Program { public static void Main(string[] args) { // Only RUN the task as needed. FooGet // still allows you to generalize your task. Task.Run(() => { dynamic value = FooGet(); value.RunSynchronously(); Console.WriteLine(value.Result.Result.ToString()); }); while (true) Thread.Sleep(100); } private static Task FooGet() { var task = new Task(() => { return asyncBar(); }); return task; } private async static Task asyncBar() { // do work! return "Hello, world!"; } }