최근에 HttpAsyncHandler를 사용하여 긴 폴링 서비스를 만들었습니다. 개발하는 동안 그것은 반복적으로 긴 폴링없이 AsyncResult 객체를 여러 번 재사용 할 수있는 "나"가 될 수 있었다. 가능한 경우 AsyncResult를 다시 작성하거나 다시 사용하여 푸시 기술을 "시뮬레이션"할 수 있습니다 (첫 번째 요청을 구독 요청 인 것처럼 처리).AsynchResult Object를 재 구축하여 푸시 기술을 시뮬레이션 할 수 있습니까?
물론 첫 번째 호출은 훌륭하지만 후속 호출에서는 "개체의 인스턴스에 설정되지 않은 개체"를 계속 제공합니다. 특정 객체가 정적이어서 "완료"되면 재사용하거나 검색 할 수 없기 때문에 "짐작"하고 있습니다 (어떤 통찰력이라도 굉장 할 것입니다!).
그래서 질문은
... 는 동적으로 이전 콜백에서 새로운 콜백을 구축 할 수 있습니까?는 초기 "가입"프로세스는 다음과 같이 진행됩니다
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);
}
}
이의 예입니다
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;
}
는 서비스가 무엇의 예입니다 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;
}
SO ... 이런 일이 가능한 것입니까?
나는 문자 그대로 이것을 시도해 보았지만 작동하지 않았다. 그러나 가능한 것 같아?
AsyncResult newRequest = new AsyncResult(request.cb, request.context, request.id);
if(request.ProcessRequest(message))
{
_subscribers.Remove(request);
Subscribers.Add(newRequest);
}
멋진 의견! –