2013-02-01 5 views
10

なぜブロックfinallyawaitが許可されていませんか?なぜ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

推測はここにある:多分それはtry ... finallyが異なるコンパイラのステップで起こるのを待っていて、うまく構成していないからだろうか? –

答えて

13

取得することが可能であることを知っている:Where can’t I use “await”?

キャッチの内部

またはfinallyブロックを。 catchブロックまたは最後に ブロックがあるかどうかにかかわらず、 tryブロックの中で "await"を使用できますが、catchブロックまたはfinallyブロックの内部では使用できません。 これを行うと、CLR例外処理のセマンティクスが中断されます。これは明らかに、もはや真から撮影C#6.0

ではありません

A C# 6.0 Language Preview

C#6.0は、この欠点を廃止し、そしてついにキャッチとの両方内で呼び出しを待つことができますブロック(既にtryブロックでサポートされていました)

関連する問題