如何创建新任务<t>(async()=&gt; {return new T();});?

时间:2015-12-07 23:24:25

标签: c# asynchronous lambda task

我需要创建一个函数,它将返回一个将在另一个时间执行的任务。

我希望该任务返回一个值(最好通过await)。

我还希望能够在该任务中使用await个方法/功能。

当我尝试创建一个应该做我想要的简单概念函数时,我收到一条红线错误消息:

private static Task<object> FooGet( ) {
    return new Task<object>( async ( ) => {
        await asyncBar( );
        return new object( );
    } );
}

错误内容为:Cannot convert lambda expression to type 'object' because it is not a delegate type

一旦我从lambda中删除了async关键字,一切都很糟糕。

我该如何解决这个问题?我能解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我在挖了一点之后找到了答案。如果有人遇到这个确切的问题the answer already exists

速记:

private static Task<object> FooGet( ) {
    return new Task<object>( async ( ) => {
        await asyncBar( );
        return new object( );
    } );
}

变为

private static Task<object> FooGet( ){
    return new Task<object>( (Func<Task<object>>)( async ( ) => {
        await asyncBar( );
        return new object( );
    }
}

答案 1 :(得分:0)

你需要明确地将其转换为Func<Task<object>>,或者如果你想让事情更具可读性,你可以将其重构为

private static Task<object> FooGet( ) {
    return new Task<object>(innerTask);
}

private async static Task<object> innerTask() {
    await asyncBar( );
    return new object( );
}

private static async Task asyncBar( ){
}