2013-05-06 4 views
8

Ich versuche, eine SignalR-Anwendung mithilfe der C# 5-async/await-Funktionen zu erstellen, aber wenn der Code ausgeführt wird, wird eine System.InvalidOperationException ausgelöst. Hier ist der einfachste Code, um das Problem zu reproduzieren.SignalR - So führen Sie eine asynchrone Aufgabe im Hub durch?

public class SampleHub : Hub 
{ 
    public Task<string> GetGoogle() 
    { 
     var http = new WebClient(); 
     return http.DownloadStringTaskAsync("http://www.google.com"); 
    } 
} 

Ausnahmedetails:

Eine asynchrone Operation kann zu diesem Zeitpunkt nicht gestartet werden. Asynchrone Operationen können nur innerhalb eines asynchronen Handlers oder Moduls oder während bestimmter Ereignisse im Seitenlebenszyklus gestartet werden. Wenn diese Ausnahmebedingung beim Ausführen einer Seite auftritt, stellen Sie sicher, dass die Seite als <% @ Page Async = \ "true \"%> markiert ist.

Stapelüberwachung:

at System.Web.AspNetSynchronizationContext.OperationStarted() 
at System.Net.WebClient.DownloadStringAsync(Uri address, Object userToken) 
at System.Net.WebClient.DownloadStringTaskAsync(Uri address) 
at System.Net.WebClient.DownloadStringTaskAsync(String address) 

Auf der Client-Seite sucht der Javascript wie diese.

$.connection.hub.start().done(function() { 
    $('#google').click(function() { 
     var google = sample.server.getGoogle(); 
     console.log(google); 
    }); 
}); 

Was habe ich falsch gemacht? Gibt es Workarounds? Ich bin sehr daran interessiert, wenn überhaupt möglich, bei den Async/Abwarten-Mustern in C# zu bleiben.

+0

Haben Sie versucht, die GetGoogle-Methode asynchron zu machen, indem Sie vor dem Methodennamen das Schlüsselwort async hinzufügen? –

+0

Ja, ich habe das versucht, und es hat nicht funktioniert. Stephens Antwort hat mein Problem endlich gelöst. –

Antwort

10

Ich würde versuchen, WebClient mit HttpClient zu ersetzen. Die DownloadStringTaskAsync ist eine Art von "bolt-on" Unterstützung für async über die bestehenden EAP Methoden, und es ist die EAP-Methoden, die SignalR ablehnt. HttpClient verwendet TAP direkt.

+0

Vielen Dank! Ich habe 2 Nächte damit verbracht, das zu schaffen, und es fällt mir nie auf, dass der gute alte Webclient der Schuldige war. –