等待新任务<t>(...):任务不运行?

时间:2015-12-07 23:44:59

标签: c# asynchronous async-await task

问题的延续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

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

4 个答案:

答案 0 :(得分:5)

创建已启动的任务

尝试创建如下任务:

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

创建任务而不启动它

如果您不想开始任务,只需使用new Task<object>(...),但在等待之前需要在该任务上调用Start()方法!

[Reference]

我的推荐

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

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}}