2012-10-14 48 views
0

我不知道如何在不使用額外線程或awaitasync關鍵字但僅包含任務的情況下完成以下程序的相同操作。示例代碼會很棒。在我看來,我們需要使用TaskCompletionSourceAsync版本的IO綁定操作或任何長時間運行的操作。如何在沒有新線程或異步且僅等待關鍵字的情況下獲得轉換任務

static void Main(string[] args) 
{ 
    Task t = Go(); 
    Console.WriteLine("Hello World"); 
    Task.Delay(1000).GetAwaiter().OnCompleted(() => { Console.WriteLine("Completed"); }); 
    Console.ReadLine(); 
} 

static async Task Go() 
{ 
    var task = PrintAnswerToLife(); 
    await task; 
    Console.WriteLine("Done"); 
} 

static async Task PrintAnswerToLife() 
{ 
    var task = GetAnswerToLife(); 
    int answer = await task; 
    Console.WriteLine(answer); 
} 

static async Task<int> GetAnswerToLife() 
{ 
    var task = Task.Delay(2000); 
    await task; 
    int answer = 21 * 2; 
    return answer; 
} 
+0

請檢查http://channel9.msdn.com/Events/Build/BUILD2011/TOOL-829T這不是一件容易的事 – zahir

+0

@zahir看起來不錯的鏈接。謝謝一堆。 – Tarik

回答

5

您可以通過使用ContinueWithasync/await一個非常簡單的翻譯成Task。其他翻譯也是可能的,例如Task.Delay變爲System.Threading.Timer

的基本模式是,對於任何async方法,做一個await

static async Task Go() 
{ 
    var task = PrintAnswerToLife(); 
    await task; 
    Console.WriteLine("Done"); 
} 

變爲:

static Task Go() 
{ 
    var tcs = new TaskCompletionSource<object>(); 
    var task = PrintAnswerToLife(); 
    task.ContinueWith(_ => 
    { 
    Console.WriteLine("Done"); 
    tcs.SetResult(null); 
    }); 
    return tcs.Task; 
} 

正確的錯誤處理更多的工作。

+0

實際上還有一件事,'ContinueWith'應該在原始方法的相同同步上下文中工作。 – zahir

+0

好的。在這個例子中,它並不重要,但通常'ContinueWith'應該使用'TaskScheduler.FromCurrentSynchronizationContext'。 –

相關問題