2016-05-04 69 views
3

在scala中有PromisesFutures。隨着Promise我可以控制Future完成時,即C#相當於Scala Promise

val p = Promise[Int]() 
val fut: Future[Int] = p.future // I already have a running Future here 

// here I can do whatever I want and when I decide Future should complete, I can simply say 
p success 7 
// and fut is now completed with value 7 

我怎樣才能實現與C#Task API類似的結果?我無法在文檔中找到任何相同的內容。

我想在測試中使用它,模擬對象返回Task,然後檢查任務完成前是否存在某種情況,然後完成並檢查另一個條件。

回答

3

您可以使用TaskCompletionSource<T>

void Main() 
{ 
    var tcs = new TaskCompletionSource<bool>(); 
    tcs.SetResult(true); 
    Console.WriteLine(tcs.Task.IsCompleted); // prints true. 
} 
0

我想你需要什麼任務。你可以找到更多的信息here

Task<int> futureB = Task.Factory.StartNew<int>(() => F1(a)); 
    int c = F2(a); 
    int d = F3(c); 
    int f = F4(futureB.Result, d); 
    return f; 

您可以使用try/catch來幫助您管理可能的錯誤。
要強制輸出值,您可以使用TaskCompletionSource,如其他用戶所述。

+0

我知道任務,我甚至在我的問題中已經說過。 –

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/12239926) –

+0

我詳細闡述了答案。感謝您的反饋@PieterVandenheede – fborges42

0

TaskCompletionSource

像尤瓦爾說,TaskCompletionSource是一種承諾和TaskFuture但需要注意的是,在C#你應該很少使用TaskCompletionSource

原因是TaskCompletionSource用於將非任務API轉換爲基於任務的API。在C#中,幾乎所有的API已經返回Task。所以儘管它們很相似 - 在C#中,你很少需要TaskCompletionSource(其中scala中的Promise是常見的)。

你可能尋找FromResult

如果你想創建任務的模擬API你不想TaskCompletionSource,你想FromResult它創建基於值完成的任務:

void Fn() 
{ 
    var task = Task.FromResult(true); 
    Console.WriteLine(task.IsCompleted); // prints true. 
    Console.WriteLine(task.Result); // prints true. a ""blocking"" API 
} 
+0

從我遇到的一直到現在,您對c#所持有的同樣看法,對Promise的使用都是一樣的,您大多使用Futures。如果你回顧我的問題,我說我需要一個未完成的任務,並決定何時完成,這不是一個常見的用法,但我需要這個用於我的測試。 –

+0

@Łukasz希望,但在Scala期貨中很常見,但不是_everywhere_,您有很多地方使用Java API和您需要轉換的回調API - 在C#中,過去幾年創建的每個API都會返回包括大型基類庫。還要注意在C#中,大多數情況下應該使用「async/await」任務。 –

+0

@Łukasz儘管如此,對於大多數人來說,你有'Task.'工具方法。當你說它是異步的 - 它在IO上是異步的嗎?你也有'任務。運行',如果它只是測試你可以阻止和(可能通常)在另一個線程上運行。 –