2013-05-06 17 views
8

C# 5 async/await özelliklerini kullanarak bir SignalR uygulaması oluşturmaya çalışıyorum, ancak kod her çalıştırıldığında bir System.InvalidOperationException atar. Sorunu yeniden üretmenin en basit kodu.SignalR - Hub'da async görevi nasıl yapılır?

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

İstisna ayrıntıları:

Zaman uyumsuz bir işlem şu anda başlatılamaz. Eşzamansız işlemler sadece bir senkronize olmayan işleyici veya modül içinde veya Sayfa yaşam döngüsündeki belirli olaylar sırasında başlatılabilir. Bir Sayfa yürütülürken bu özel durum oluştuğunda, Sayfanın <% @ Page Async = \ "true \"%> işaretlendiğinden emin olun.

Yığın izleme: istemci tarafında

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) 

, JavaScript buna benzer.

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

Neyi yanlış yaptım? Herhangi bir geçici çözüm var mı? Eğer mümkünse C#'deki async/await desenlerine bağlı kalmayı çok istiyorum.

+0

Yöntem adından önce anahtar sözcüğünü async ekleyerek GetGoogle yöntemini uyumsuz hale getirmeyi denediniz mi? –

+0

Evet, bunu denedim ve işe yaramadı. Stephen'ın cevabı nihayet sorunumu çözdü. –

cevap

10

WebClient'u HttpClient ile değiştirmeyi denerim. DownloadStringTaskAsync, mevcut EAP yöntemleri üzerinden async için bir "bolt-on" desteğidir ve SignalR'nin itiraz ettiği EAP yöntemleridir. HttpClient doğrudan TAP kullanır.

+0

Çok teşekkür ederim! Çalışmaya çalışmak için 2 gece harcadım ve bana asla eski güzel WebClient'in suçlu olduğunu söylemedim. –