Deadlock mit ContinueWiths in WebAPI

Wir sind auf viele Deadlocks gestoßen, als wir einen Teil des vorhandenen Codes über die Web-API verfügbar gemacht haben. Ich konnte das Problem auf dieses sehr einfache Beispiel reduzieren, das für immer hängen bleibt:

public class MyController : ApiController
{
    public Task Get()
    {
        var context = TaskScheduler.FromCurrentSynchronizationContext();

        return Task.FromResult(1)
            .ContinueWith(_ => { }, context)
            .ContinueWith(_ => Ok(DateTime.Now.ToLongTimeString()), context);
    }
}

Dieser Code scheint mir einfach zu sein. Das mag ein bisschen kompliziert erscheinen, aber das liegt nur daran, dass ich versucht habe, das Problem so weit wie möglich zu vereinfachen. Es scheint, als würden zwei ContinueWiths, die auf diese Weise verkettet sind, den Deadlock verursachen. Wenn ich das erste ContinueWith auskommentiere (das macht eigentlich sowieso nichts), funktioniert es einwandfrei. Ich kann es auch 'beheben', indem ich keinen speziellen Scheduler gebe (aber das ist keine praktikable Lösung für uns, da unser realer Code auf dem richtigen / ursprünglichen Thread sein muss). Hier habe ich die beiden ContinueWiths direkt nebeneinander gestellt, aber in unserer realen Anwendung geschieht eine Menge Logik, und die ContinueWiths kommen letztendlich von verschiedenen Methoden.

Ich weiß, dass ich dieses spezielle Beispiel mit async / await neu schreiben könnte, und es würde die Dinge vereinfachen und den Deadlock zu beheben scheinen. Wir haben jedoch eine Menge alten Code, der in den letzten Jahren geschrieben wurde - und der größtenteils vor dem Erscheinen von async / await geschrieben wurde, sodass ContinueWiths stark genutzt wird. Das Umschreiben all dieser Logik ist etwas, was wir momentan nicht tun möchten, wenn wir es vermeiden können. Code wie dieser hat in allen anderen Szenarien (Desktop-App, Silverlight-App, Befehlszeilen-App usw.) einwandfrei funktioniert. Diese Probleme treten nur bei der Web-API auf.

Gibt es etwas, das getan werden kann?generisch das kann diese Art von Deadlock lösen? Ich bin auf der Suche nach einer Lösung, bei der hoffentlich nicht alle ContinueWiths neu geschrieben werden, um async / await zu verwenden.

Aktualisieren:

Der obige Code ist der gesamte Code in meinem Controller. Ich habe versucht, dies mit der minimalen Menge an Code reproduzierbar zu machen. Ich habe das sogar in einer brandneuen Lösung gemacht. Die ganzen Schritte, die ich gemacht habe:

Erstellen Sie in Visual Studio 2013 Update 1 unter Windows 7 (mit .NET Framework 4.5.1) ein neues Projekt mit der ASP.NET-WebanwendungsvorlageWählen Sie als Vorlage die Web-API aus (auf dem nächsten Bildschirm)Ersetzen Sie die Get () -Methode im automatisch erstellten ValuesController durch das in meinem ursprünglichen Code angegebene BeispielDrücken Sie F5, um die App zu starten und zu ./api/values zu navigieren - die Anforderung bleibt für immer hängenIch habe versucht, die Website auch in IIS zu hosten (anstatt IIS Express zu verwenden)Ich habe auch versucht, alle verschiedenen Nuget-Pakete zu aktualisieren, sodass ich immer auf dem neuesten Stand war

Die web.config bleibt von dem, was die Vorlage erstellt hat, unberührt. Im Einzelnen hat es Folgendes:

<system.web>
   <compilation debug="true" targetFramework="4.5" />
   <httpRuntime targetFramework="4.5" />
</system.web>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage