最近,我使用 HttpAsyncHandler 成功创建了一个长轮询服务。在开发过程中,我想到(我)“可能”能够多次重用 AsyncResult 对象,而无需反复进行长轮询。如果可能的话,我可以通过以某种方式重新构建或重新使用 AsyncResult 来“模拟”推送技术(将第一个请求视为订阅请求)。
当然,第一次调用效果很好,但随后的调用不断给我“对象未设置为对象的实例”。我“猜测”是因为某些对象是静态的,因此,一旦“完成”就无法重用或检索(任何洞察力都会很棒!)。
所以问题是……</p>
是否可以从旧回调动态构建新回调?
最初的“订阅”过程如下:
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
Guid id = new Guid(context.Request["Key"]);
AsyncResult request = new AsyncResult(cb, context, id);
Service.Singleton.Subscribe(request);
return request;
}
以下是该服务的功能示例:
private void MainLoop()
{
while (true)
{
if (_subscribers.Count == 0)
{
if (_messages.Count == max)
_messages.Clear();
}
else
{
if (_messages.Count > 0)
{
Message message = _messages.Dequeue();
foreach (AsyncResult request in _subscribers.ToArray())
{
if(request.ProcessRequest(message));
_subscribers.Remove(request);
}
}
}
Thread.Sleep(500);
}
}
以下是 AsyncResult.ProcessRequest() 调用的示例:
public bool ProcessRequest(Message message)
{
try
{
this.Response = DoSomethingUseful(message);
this.Response.SessionValid = true;
}
catch (Exception ex)
{
this.Response = new Response();
this.Response.SessionValid = false;
}
this.IsCompleted = true;
_asyncCallback(this);
return this.IsCompleted;
}
那么……这样的事情可能吗?
我真的试过这个,但它没有用......但是“喜欢”的东西可能吗?
AsyncResult newRequest = new AsyncResult(request.cb, request.context, request.id);
if(request.ProcessRequest(message))
{
_subscribers.Remove(request);
Subscribers.Add(newRequest);
}