0

グリッドコントロールがあり、各行をクリックすると、データをロードするためのバックグラウンドジョブが実行されます。各バックグラウンドジョブは、スレッドプールスレッドで実行されます。ユーザーがアイテムをすばやくクリックすると、データをロードするための多くのリクエストがキューに入れられます。各行をクリックした後に遅延を提供することで、これを最小限に抑えたいと思います。データをロードするリクエストを実行する前に、多少の遅延が発生します。

DispatcherTimerクラスの使用を考えています。何かのようなもの、

readonly DispatcherTimer dt = new DispatcherTimer();
private void Clicked(object sender, RoutedEventArgs e)
{
    dt.Interval = TimeSpan.FromSeconds(2);
    dt.Stop();
    dt.Start();
}

private void DtOnTick(object sender, EventArgs args)
{
    // Fire a thread and do data loading
}

これは問題に取り組む正しい方法ですか?

任意の提案をいただければ幸いです!

4

3 に答える 3

1

ジョブが終了するまでコントロールを無効にするのはどうですか?または、実行するジョブのキューが特定のサイズに達したら無効にしますか?これは、ユーザーが「クリックしすぎ」ないようにするための簡単なソリューションです。このようにして、遅延はソリューションの効率/コンピューターの速度に比例します。

于 2011-05-16T14:42:52.370 に答える
1

あなたがやろうとしている方法は、問題自体を2秒間遅らせるだけです。すべてのクリックは 2 秒後に処理されます。

ワーカー スレッドを使用してみてください。クリックされた時点でクリックされた各アイテムに関する情報を取得するキューを使用するとします。クラスの作成時に作成された既存のスレッドは、新しいアイテムがキューに追加されると通知されます。スレッドは最初のアイテムを取得して処理し、UI を更新します。さらにアイテムがある場合は、次のアイテムを取得して処理します。アイテムがなくなると、スレッドは新しいアイテムが利用可能になるまでスリープ状態になります (ManualResetEventここで役立ちます)。

パターンは次のようになります。

void ItemClicked(...) 
{
    lock (WorkQueue)
    {
        QueueNewClickItem(...);
        m_workToDo.Set();
    }
}


void WorkerThread(...)
{
    bool threadShouldEnd = false;
    while (!threadShouldEnd)
    {
        if (WaitHandle.WaitAny(m_workToDo, m_endThread) == 0)
        {
           lock (WorkQueue)
           {
               CopyAllPendingWorkItemsToListInThread();
               ClearWorkQueue();
               m_workToDo.Reset();
           }

           while (!AllLocalItemsProcessed)
           {
               ProcessNextWorkItem();
           }
        }
        else
        {
            threadShouldEnd = true;
        }
     }
 }
于 2011-05-16T15:04:12.003 に答える
0

実際にやりたいことは次のようなものです。

private DateTime? _NextAllowedClick;

private void Clicked(object sender, RoutedEventArgs e)
{
   if (_NextAllowedClick != null && DateTime.Now < _NextAllowedClick)
   {
      return;
   }
   _NextAllowedClick = DateTime.Now + new TimeSpan(0, 0, 0, 2);
   ...
}
于 2011-05-16T18:19:23.510 に答える