2

エンドユーザーがリクエストを行ったにもかかわらず、特定の時間間隔の後にのみ関数を呼び出す

public override void SendNotificationMessage(NotificationMessageRequest request)
    {......}

これは、クリック アクションがあるときにトリガーされる関数です。

私はこれが特定の時間間隔でのみ呼び出されるようにしたい.5分と言います.ユーザーは時間間隔の前にリクエストを行います...

私は自分の目的を果たすためにタイマーを用意しようとしていますが、問題はユーザーがクリックするたびにタイマーが再び開始されることです..タイマーによって機能を制御する方法

PS:クリックが行われたユーザーアプリケーションで変更を加えることができません

4

4 に答える 4

2

まず、辞書をクラスに追加する必要があります。

Dictionnary<int, NotificationMessageRequest> _notifications

次に、ユーザーがボタンをクリックしたときに、この関数を実行する必要があります (または、現在実行されている関数を次のように変更します)。

private void PlanNotification(NotificationMessageRequest request, int userId)
{
    // or grab the userId from where you can
    lock(_notifications) // if needed ?
    {
        if (_notifications.Contains(userId)) return;

        _notifications.Add(userId, request);
    }
}

次に、タイマー イベントでこのメソッドを呼び出します。

private void SendNotifications()
{
    lock(_notifications)
    {
        foreach(KeyValuePair<int, NotificationMessageRequest> p in _notifications)
            SendNotificationMessage(p.Value);

        _notifications.Clear();
    }
}

多かれ少なかれそのようなことをすると、必要な動作が得られます。

于 2013-05-08T10:07:24.443 に答える
0

タイマーを作成し、その間隔を適切な値に設定します。System.Collections.Concurrent.ConcurrentQueue<YourMessageType>次に、型(適合する場合は静的)のフィールドを宣言し、メッセージを のキューに入れますOnClick

タイマーが刻むときTryDequeue、メッセージを呼び出して処理します。

于 2013-05-08T10:43:23.020 に答える
0

私は現在のシステムで同様のことをしています。私の場合、リモート サービスに対して複数の呼び出しを行うのではなく、それらを 1 つにまとめることができるように、データ要求をバッチ処理しています。

これは、システムの概要です。

1 つのメソッド MakeRequest() を持つ Collat​​orClass があります 内部的に、Collat​​orClass には、null に初期化される Timer オブジェクトと、要求の詳細を保持するオブジェクトの List があります。

MakeRequest が呼び出されたとき: null の場合、タイマーが開始されます。リクエストの詳細がリストに追加されます。

タイマーが時間切れになると、システムはリストからすべてのリクエストの詳細を読み取り、適切なアクションを実行します。(このすべてのスレッドを安全にするために、ロックを使用する必要がある場合があることに注意してください)。

必要に応じて、データ リクエストが実際に実行されたときに呼び出される Action 参照を渡すこともできます。ただし、これがあなたの場合に必要かどうかはわかりません。

詳細を知りたい場合はお知らせください。

于 2013-05-08T09:54:01.413 に答える