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

Wil*_*ill 10 c# asynchronous task async-await

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

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

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

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

我只能猜测我做错了.

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

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

Joa*_*nvo 7

创建任务已经开始

尝试创建这样的任务:

Task.Factory.StartNew<object>((Func<Task<object>>) ...);
Run Code Online (Sandbox Code Playgroud)

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

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

[参考]

我的推荐

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

private static Func<object> GetFunction( ) {
    return (Func<object>)(( ) => {
        SimpleMessage.Show( "TEST" );
        return new object( );
    } );
}
Run Code Online (Sandbox Code Playgroud)

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

Task.Factory.StartNew<object>(GetFunction());
Run Code Online (Sandbox Code Playgroud)

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

GetFunction()();
Run Code Online (Sandbox Code Playgroud)

  • 鉴于我所处理的情况的复杂性,这个问题超出了考虑的范围(TL; DR:我做错了).但是,您的答案是创建任务并在不启动任务的情况下返回任务的正确方法. (2认同)

Ste*_*ary 6

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

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

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

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

当您准备好执行它时,就像任何其他委托一样调用它。请注意,它返回 a 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
Run Code Online (Sandbox Code Playgroud)

  • 为什么不应该使用 Task 构造函数或 Start? (2认同)

usr*_*usr 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( );
} ) );
Run Code Online (Sandbox Code Playgroud)

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

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