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