2015-12-07 34 views
2

我需要創建一個函數,它將返回將在另一時間執行的任務。如何創建新的任務<T>(async()=> {return new T();});?

我想爲該任務返回一個值(最好通過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關鍵字,一切都是hunky dory。

我該如何解決這個問題?我能解決這個問題嗎?

回答

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(); 
    } 
} 
+0

既然你需要明確地將它轉換爲Func<Task<object>>或你已經添加到另一個答案,我認爲這是完全可以得到upvotes。然而,如果你決定不接收它們,你總是可以添加一個答案作爲社區維基,這大部分都會從你的帖子中刪除你的所有權。 – halfer

+0

@halfer我...幾乎不知道你在說什麼。請問我有一些情況嗎? – Will

+0

查看我對你的答案所做的修改 - 你要求人們提出另一個答案,並明確表示不是你自己的答案。我把它編輯了出來,因爲我覺得這是過度的元評論,但無論如何,我認爲你對自己是不公平的,而且如果人們願意給他們提出自己的問題,那麼你的問題就值得讚賞了。 – halfer

0

,如果你想使事情更易讀,你可以refactory這是

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(){ 
}