Недавно я успешно создал сервис длинных опросов, используя HttpAsyncHandler's.Во время разработки мне пришло в голову (что) я «мог бы» многократно использовать объект AsyncResult много раз без длительного опроса.Если возможно, я мог бы затем «смоделировать» push-технологию, перестроив или повторно использовав AsyncResult (обработав первый запрос как запрос на подписку).прекрасно работает, но последующие вызовы продолжают давать мне «Объект не установлен на экземпляр объекта».Я «догадываюсь», что это потому, что некоторые объекты статичны, и поэтому, «завершенный» не может быть повторно использован или извлечен (любое понимание будет УДИВИТЕЛЬНО!)1006 * Можно ли динамически построить новый обратный вызов из старого обратного вызова?
Первоначальный процесс «подписки» выглядит следующим образом:
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);
}