2013-01-10 61 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(); 
    } 
}