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.
Haben Sie versucht, die GetGoogle-Methode asynchron zu machen, indem Sie vor dem Methodennamen das Schlüsselwort async hinzufügen? –
Ja, ich habe das versucht, und es hat nicht funktioniert. Stephens Antwort hat mein Problem endlich gelöst. –