2013-02-01 15 views
10

Perché await non è consentito in un blocco finally?Perché attendere non è consentito in un blocco finale?

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

sapendo che è possibile ottenere il Awaiter manualmente

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

Hai letto il post del blog di Eric Lippert su nessun rendimento in blocchi alla fine? Molti degli stessi punti si applicano: http://blogs.msdn.com/b/ericlippert/archive/2009/07/16/iterator-blocks-part-three-why-no-yield-in-finally.aspx –

+0

solo congettura qui: forse è perché provare ... finalmente e attendi accadere in diversi passi del compilatore e non compongono bene? –

risposta

13

Tratto da: Where can’t I use “await”?

All'interno di una cattura o di blocco finally. È possibile utilizzare "attendere" all'interno di un blocco di prova , indipendentemente dal fatto che abbia associato blocchi o infine blocchi , ma non è possibile utilizzarlo all'interno dei blocchi catch o finally. In questo modo si interrompe la semantica della gestione delle eccezioni CLR.

Questo non è evidentemente più vero in C# 6,0

Tratto da: A C# 6.0 Language Preview

C# 6.0 elimina questa carenza, e consente ora attendono di chiamate all'interno sia fermo e, infine, blocchi (erano già supportati nei blocchi di prova)

Problemi correlati