2013-01-10 100 views
1

因此,我一直關注着SignalR和ASP.NET Async上的Steven Sanderson的TechDays Talk。我已經與以下操作MVC AsyncController Blocking

public class SomeController : AsyncController 
{ 
    static TaskCompletionSource<String> _nextMessage 
     = new TaskCompletionSource<string>(); 

    [HttpPost] 
    public ActionResult PostMessage(string message) 
    {    
     _nextMessage = new TaskCompletionSource<string>(); 
     oldNextMessage.SetResult(message); 
     return Content("success"); 
    } 

    public async void GetMessages() 
    { 
     Response.ContentType = "text/event-stream"; 
     while (true) 
     { 
      var message = await _nextMessage.Task; 
      Response.Write("data: " + message + "\n\n"); 
      Response.Flush(); 
     } 

    } 
} 

的getMessages似乎被阻塞時,它首先被稱爲碰到一個問題,但一旦超時,它開始按預期工作。

因此,我加載了我的JavaScript,發佈並運行GetMessages。在第一次調用的getMessages,它掛起(預期)在

await _nextMessage.Task; 

,但它不會讓我從任何地方(包括瀏覽器的其他實例),以PostMessage的呼叫這是我的開發機器上,所以它可能是一個線程問題,但我認爲這樣做的全部目的是讓線程能夠處理多種事情。而且,除了第一次超時之後,它開始按預期工作,我可以發佈信息並立即獲得響應。但是,如果我刷新頁面,我會遇到同樣的問題。有想法該怎麼解決這個嗎?我使用的是Eventsource,但是當我進行長輪詢時也會出現同樣的問題,例如

public async Task<string> GetNextMessage() 
    { 

     return await _nextMessage.Task; 
    } 

與()

+3

嘗試禁用會話狀態。 – SLaks

+0

我如何在MVC4中做到這一點。谷歌正在讓我失望。 – DrSammyD

+0

[SessionState(SessionStateBehavior.Disabled)] – DrSammyD

回答

1

一個javascript循環函數調用GetNextMessage這裏是我結束了使用

[SessionState(SessionStateBehavior.Disabled)] 
public class SomeController : AsyncController 
{ 
    static TaskCompletionSource<String> _nextMessage = 
     new TaskCompletionSource<string>(); 

    public void PostMessage(string message) 
    { 
     var CreationJObj = FormUtils.AsciiToJObject(Request.Form[0]); 
     var CreationObj = FormUtils.FromJObject<MessageDisplayVO>(CreationJObj); 
     Parallel.Invoke(() => { _nextMessage.SetResult(CreationObj.Message); }); 
     _nextMessage = new TaskCompletionSource<string>(); 

    } 

    public async void GetMessages() 
    { 
     Response.ContentType = "text/event-stream"; 
     var oldMessage = _nextMessage; 
     var message = await oldMessage.Task; 
     Response.Write("data: " + message + "\n\n"); 
     Response.Flush(); 
    } 
}