这里问的一个问题的延续:
在上述问题中,我有以下函数返回Task类型的对象(用于增量测试目的):
private static Task
当我调用时await GetInstance( );
,函数被调用(我假设任务被返回,因为没有抛出异常),但随后任务就在那里.
我只能猜测我做错了.
我不希望此函数返回已在运行的任务(即IMPERATIVE).
如何异步运行此函数返回的任务?
创建任务已经开始
尝试创建这样的任务:
Task.Factory.StartNew((Func >) ...);
在不启动任务的情况下创建任务
如果您不希望任务启动,只需new Task
按原样使用,但是Start()
在等待它之前需要调用该任务的方法!
[参考]
我的推荐
只需创建一个返回匿名函数的方法,如下所示:
private static FuncGetFunction( ) { return (Func )(( ) => { SimpleMessage.Show( "TEST" ); return new object( ); } ); }
然后得到它并在Task
需要时以新的方式运行它(还要注意我async/await
从lambda表达式中删除了它,因为你已将它放入一个Task中):
Task.Factory.StartNew(GetFunction());
这样做的一个优点是你也可以调用它而不将它放入Task
:
GetFunction()();
你在那里遇到了糟糕的设计.在这些限制条件下,我会尝试让一些东西适合你.
延迟启动任务的唯一方法是使用该Task.Start
方法.(你也可以使用,RunSynchronously
但它并没有真正利用任何任务功能.此时任务变成一个无线的懒惰对象.
所以使用Task.Start
方法.
await
不启动任务.它等待已经运行的任务.因此await new Task(() => { })
总是永远冻结.
另一个问题是:
return new Task( (Func >)(async ( ) => { await SimpleMessage.ShowAsync( "TEST" ); return new object( ); } ) );
当你启动该任务时,它几乎会立即完成,Task.Result
并将执行另一项任务 - 异步lambda返回的任务.我怀疑这是你想要的.很难做到这一点,我不知道你需要什么.
这有点像XY问题.你能详细说明你想要完成的事情吗?感觉就像你给了自己不必要的限制.