2012-10-26 5 views
15

Ich erhalte den folgenden Kompilierungsfehler von ccrewrite bei der Verwendung von Code Contracts 1.4.51019.0 in VS2012 unter Windows 7 x64: "Die Methode oder Operation ist nicht implementiert. " Code Contracts + Async in .NET 4.5: "Die Methode oder der Vorgang ist nicht implementiert"

Es scheint, durch eine Kombination von Eigenschaftenaccessoren und die Verwendung von async Methoden, die eine innere await fehlt verursacht werden.

Schritte Fortpflanzung:

eine neue Klassenbibliothek erstellen mit 'Voll' Runtime Vertrag Prüfungen aktiviert:

namespace CodeContractsAsyncBug 
{ 
    using System.Threading.Tasks; 

    public class Service 
    { 
     // Offending method! 
     public async Task ProcessAsync(Entity entity) 
     { 
      var flag = entity.Flag; 
     } 
    } 

    public class Entity 
    { 
     public bool Flag { get; set; } 
    } 
} 

Hat jemand erlebt?

+0

Das Entfernen des 'async' Modifiers behebt das Problem, nehme ich an? –

+0

Ja (außer Sie müssten dann eine Aufgabe zurückgeben). –

+2

Das ist Mike Barnetts Projekt. Er mag es, E-Mails zu bekommen, also zögern Sie nicht, ihn über diesen Fehler zu informieren. mbarnett _at_ microsoft _dot_ com –

Antwort

2

Dies scheint in Version 1.5 von Code Contracts behoben zu sein.

+0

Laddington Bär;) –

0

Ich glaube, async Schlüsselwort steht nur dafür - entweder Sie haben eine Wartezeit während des Codes, durch die es eine Aufgabe generiert und beim Aufruf der Methode behandelt wird, oder Sie müssen eine Aufgabe explizit zurückgeben.

+2

Sie sicherlich * kann * haben ' asynchrone Methode ohne 'erwarten'. Es bedeutet normalerweise, dass der Autor des Codes nicht versteht, wie "async" funktioniert (und es erzeugt deswegen eine Warnung), aber es funktioniert und ich denke, dass es in einigen seltenen Fällen nützlich sein kann. – svick

+0

Es gibt auch einige andere feine Unterschiede. Beispielsweise wird eine Ausnahme, die von einer asynchronen Methode ausgelöst wird, immer auf die Aufgabe angewendet und niemals synchron ausgelöst. –

2

Eine async Methode, die nicht await ist, weist normalerweise auf einen Programmierfehler hin. Es gibt eine Compiler-Warnung, die Sie über diese Situation informiert.

Wenn Sie mögen synchron ein Verfahren mit einem asynchronen Signatur implementieren, der normale Weg, dies zu tun, ist ein nicht async Verfahren zu implementieren und ein Task, wie Task.FromResult<object>(null) zurückzukehren. Beachten Sie, dass bei diesem Ansatz Ausnahmen synchron ausgelöst werden und nicht auf dem zurückgegebenen Task platziert werden.

+2

Ja, aber das erklärt nicht den Code Contracts Fehler. – svick

+1

Ich bin mir seiner korrekten Verwendung bewusst, und Sie haben recht, wenn Sie sagen, dass die Behebung von nicht asynchrem Code das Problem löst. Es ist aber immer noch ein Code Contracts Bug :) –

1

In den letzten Monaten haben wir viele Probleme beim Neuschreiben von asynchronen Methoden behoben. Ich würde vorschlagen, dass Sie Ihren Code erneut auf dem neuesten Installer versuchen und wenn Sie immer noch ein Problem haben, bitte eine vollständige Repro bereitstellen.

Verwandte Themen