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

Await new Task<T>( ... ) : Task does not run?

here 问题的延续:

在上述问题中,我有以下函数,其中 return 是一个任务类型的对象(用于增量测试目的):

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

当我调用 await GetInstance( ); 时,该函数被调用(并且我假设任务是 returned,因为没有抛出异常)但是任务就在那里。

我只能猜测我当时做错了。

我不希望此功能 return 一个 已经 运行ning 的任务(那个是 命令式[​​=31=]).

如何异步运行任务return由这个函数编辑?

创建一个已经开始的任务

尝试像这样创建任务:

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

创建任务而不启动它

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

[Reference]

我的推荐

只需要创建一个returns匿名函数的方法,像这样:

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

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

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

这样做的一个好处是您也可以调用它而无需将其放入 Task:

GetFunction()();

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

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<object> FooGet()
    {
        var task = new Task<object>(() => {
            return asyncBar();
        });

        return task;
    }

    private async static Task<object> asyncBar()
    {
        // do work!
        return "Hello, world!";
    }
}

你被一个糟糕的设计困住了。在这些限制条件下,我会尝试为您做一些工作。

延迟启动任务的唯一方法是使用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 问题。你能详细说明你想要完成什么吗?感觉给了自己不必要的束缚

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

I do not want this function to return a task that is already running ( that is IMPERATIVE ).

所以,您想要 return 一些在您调用之前不会执行的代码?那是代表,不是 Task.

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

当您准备好执行它时,就像调用任何其他委托一样调用它。请注意,它 return 是 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