所以我一直在关注 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;
}
使用调用 GetNextMessage() 的 javascript 循环函数