首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC AsyncController阻塞

MVC AsyncController阻塞
EN

Stack Overflow用户
提问于 2013-01-11 00:27:45
回答 1查看 490关注 0票数 1

所以我一直在关注Steven Sanderson在SignalR和ASP.NET Async上的TechDays Talk。我在执行以下操作时遇到了问题

代码语言:javascript
复制
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时,它挂起(不出所料)

代码语言:javascript
复制
await _nextMessage.Task;

但是它不允许我从任何地方(包括浏览器的其他实例)调用PostMessage,这是在我的开发机器上,所以这可能是一个线程问题,但我认为它的整个目的是允许线程在多个事情上工作。此外,在它第一次超时后,它开始按预期工作,在那里我可以发布,并立即获得响应。但是如果我刷新页面,也会遇到同样的问题。有什么办法解决这个问题吗?顺便说一下,我正在使用Eventsource,但当我做长轮询时,也会出现同样的问题。

代码语言:javascript
复制
    public async Task<string> GetNextMessage()
    {

        return await _nextMessage.Task;
    }

使用javascript循环函数调用GetNextMessage()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-12 00:11:55

以下是我最终使用的内容

代码语言:javascript
复制
[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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14262591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档