所以我一直在关注Steven Sanderson在SignalR和ASP.NET Async上的TechDays Talk。我在执行以下操作时遇到了问题
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;
}使用javascript循环函数调用GetNextMessage()
发布于 2013-01-12 00:11:55
以下是我最终使用的内容
[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();
}
}https://stackoverflow.com/questions/14262591
复制相似问题