2013-02-01 35 views
10

爲什麼await不允許在finally塊中?爲什麼在finally塊中不允許等待?

public async void Fn() 
{ 
    try 
    { 
    } 
    finally 
    { 
     await Task.Delay(4000); 
    } 
} 

知道這是可能得到Awaiter手動

public void Fn() 
{ 
    try 
    { 
    } 
    finally 
    { 
     var awaiter = Task.Delay(4000).GetAwaiter(); 
    } 
} 
+8

你讀過Eric Lippert的博文嗎最終塊沒有產量?許多相同的觀點適用:http://blogs.msdn.com/b/ericlippert/archive/2009/07/16/iterator-blocks-part-three-why-no-yield-in-finally.aspx –

+0

只是在這裏猜測:也許這是因爲嘗試...最後,並在不同的編譯器步驟等待發生,他們不寫作? –

回答

13

來自Where can’t I use 「await」?

裏面的catch或finally塊。您可以在 try塊內使用「await」,無論它是否具有關聯的catch或最終 塊,但不能在catch或finally塊中使用它。 這樣做會中斷CLR異常處理的語義。

這顯然不再是真正的在C#6.0

來自A C# 6.0 Language Preview

C#6.0中這方面的不足做了,現在讓伺機既抓,最後內通話塊(它們已經在try塊中得到支持)