【发布时间】:2015-12-03 21:01:02
【问题描述】:
似乎我在理解有关 C# 中的异步操作,尤其是控制器中的 ASP.NET MVC 的主题方面存在很大问题。
我的网页中的所有 AJAX 请求都有一个控制器。对于每一个我都有一个动作。现在我尝试像“通知系统”一样实现。我创建了一个类来处理队列中的通知,这些通知是使用 SessionID 通过字典选择的。
因为我使用的是 Reverse-AJAX,所以处理 AJAX-Response 的线程需要在服务器上保持。因此,我将Thread.Sleep 与while 结合使用来检查队列是否有元素。这是控制器的部分:
public class AJAXController : AsyncController
{
public async void polling()
{
if (Session["init"] == null) //so the sessionID is not changing on every request
Session.Add("init", 0);
NotificationQueue queue =
NotificationQueue.getInstance(HttpContext.Session.SessionID);
object responseObj = null;
responseObj = await Task.Run(() =>
{
while (queue.getSize() == 0)
Thread.Sleep(200);
return queue.getNextQueueElement(); //behind this is queue.Dequeue();
});
Response.Write(new JavaScriptSerializer().Serialize(responseObj));
}
}
基本上,我现在不知道该代码有什么不正确的地方——我知道这两个代码都不正确。
语法是正确的,但是当我尝试使用该网站时,服务器回答:500 (internal Server error),消息:>>此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保该页面标记为<%@ Page Async="true" %>。此异常还可能表示尝试调用“async void”方法,在 ASP.NET 请求处理中通常不支持该方法。相反,异步方法应该返回一个任务,调用者应该等待它。
我需要AsyncController 吗?其他方法不是异步的,因为它们只是简单的响应。
我尝试将public async void pollingAsync()与public async string pollingCompleted(string response)结合使用,但参数每次都是null。
我的问题是上述以及我如何解决问题。有没有更好的解决方案,如果有,我该如何实施?
感谢您的帮助!
【问题讨论】:
-
与您的问题没有太大关系,但这似乎是使用 SignalR 而不是 Ajax 的好用例。
标签: c# asp.net .net multithreading threadpool