AsynchResultオブジェクトを再構築することでプッシュテクノロジーをシミュレートする - それは可能ですか?

StackOverflow https://stackoverflow.com/questions/4370997

質問

最近、httpasynchandler'sを使用して長期間のサービスを成功裏に作成しました。開発中、それは私に来ました(それ)私は、繰り返し繰り返しポルリングすることなく、非同期オブジェクトを何度も再利用できるかもしれません。可能であれば、Asyncresultを何らかの形で再構築または再利用することにより、プッシュテクノロジーを「シミュレート」することができます(最初のリクエストをサブスクリプション要求であるかのように扱うことができます)。

もちろん、最初の呼び出しはうまく機能しますが、その後の呼び出しは「オブジェクトのインスタンスに設定されていないオブジェクト」を与えてくれます。私は「推測」しているのは、特定のオブジェクトが静的であるため、「完了」が再利用または取得できないためです(洞察は素晴らしいでしょう!)。

だから質問は…

古いコールバックからの新しいコールバックを動的に構築することは可能ですか?

最初の「サブスクリプション」プロセスは次のようになります。

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);
}
役に立ちましたか?

解決

IAsyncResult 実装は満たさなければなりません 特定の不変, 、その1つは、1回しか完成できないということです。あなたはそれを特定しません AsyncResult あなたは使用していますが、そうなら リヒターの有名なバージョン, 、それからそれはその不変です。

あなたが実装する問題を経験したくない場合 イベントベースの非同期パターン, 、それから最良のオプションはです Microsoft RX, 、これは真のプッシュベースのシステムです。

他のヒント

私はihttpasynchandlerのインターフェースと使用に完全に不慣れであると言って、最初に序文を序文にしましょう。

そうは言っても、非同期プログラミングモデルを使用する場合、それぞれの非同期は特定の非同期メソッド呼び出しを表し、再利用するべきではありません。 BeginProcessing(Callback Method)よりもRegisterEvent(コールバック)メソッドを探しているようです。したがって、これを機能させることができたとしても、デザインは非同期プログラミングベストプラクティス(IMHO)によって保持されません。

リクエスト/応答ベースのHTTPを使用しているため、1つのリクエストに対して複数の応答をプッシュできる可能性は低いと思います。あなたが目指していることに問題があるという未回答の要求に。

リモートでは、リモートイベントに登録でき、WCFはデュプレックス契約をサポートできます。

幸運を。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top