首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过重建AsynchResult对象来模拟推送技术--甚至可能吗?

通过重建AsynchResult对象来模拟推送技术--甚至可能吗?
EN

Stack Overflow用户
提问于 2010-12-06 21:11:28
回答 2查看 541关注 0票数 2

最近,我成功地使用HttpAsyncHandler创建了一个长轮询服务,在开发过程中,我“可能”能够多次重复使用AsyncResult对象,而不需要反复进行长轮询。如果可能的话,我可以通过重新构建或以某种方式重用AsyncResult来“模拟”推送技术(将第一个请求视为订阅请求)。

当然,第一次调用很有效,但是后续的调用总是给我“对象没有设置为对象的实例”。我“猜”是因为某些对象是静态的,因此,一旦“完成”就不能重用或检索(任何洞察力都会很棒!)

所以问题是…

可以从旧的回调动态构建一个新的回调吗?

初始的“订阅”过程如下:

代码语言:javascript
复制
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;
}

这里是服务所做的一个例子:

代码语言:javascript
复制
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()调用所做的一个例子:

代码语言:javascript
复制
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...WOULD这样的事情是可能的吗?

我真的试过了,但work...but不是什么“类似”的东西,它可能吗?

代码语言:javascript
复制
AsyncResult newRequest = new AsyncResult(request.cb, request.context, request.id);

if(request.ProcessRequest(message))
{
     _subscribers.Remove(request);
     Subscribers.Add(newRequest);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-07 04:00:00

IAsyncResult实现必须满足某些不变量,其中之一是只能完成一次。您没有标识您正在使用的AsyncResult,但是如果它是里氏名著,那么它将保持不变。

如果您不想经历实现基于事件的异步模式的麻烦,那么最好的选择是微软Rx,它是一个真正的基于推送的系统。

票数 4
EN

Stack Overflow用户

发布于 2010-12-06 22:32:21

首先,我要说我对IHttpAsyncHandler接口和用法完全不熟悉。

也就是说,通常在使用异步编程模型时,每个AsyncResult都代表一个特定的异步方法调用,不应该被重用。似乎您更多地是寻找一个RegisterEvent(回调)方法,而不是一个BeginProcessing(回调方法)-因此,即使您能够使其工作,设计不支持异步编程最佳实践(IMHO)。

我假设,由于您使用的是基于请求/响应的http,您似乎不太可能为一个请求推送多个响应,而且即使您能够以某种方式破解这个请求,您的客户端最终也会因为其未回答的请求而获得超时,这对于您要执行的任务来说是有问题的。

我知道,在远程处理中,您可以注册远程事件,WCF支持双工合同,如果这是一个选项,可以启用“推送技术”。

祝好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4370997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档