Отсрочка исполнения - C # WPF - PullRequest
0 голосов
/ 16 мая 2011

У меня есть элемент управления Grid, и щелчок по каждой строке выполняет некоторую фоновую работу для загрузки данных.Каждое фоновое задание выполняется в потоке пула потоков.Когда пользователь быстро нажимает на элементы, многие запросы на загрузку данных будут поставлены в очередь.Я хочу минимизировать это, предоставляя задержку после нажатия на каждую строку.Перед запуском запроса на загрузку данных будет некоторая задержка.

Я думаю об использовании 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
}

Это правильный способ решения проблемы?

Будем благодарны за любые предложения!

Ответы [ 3 ]

1 голос
/ 16 мая 2011

То, как вы пытаетесь это сделать, просто задержит саму проблему на 2 секунды.Все щелчки будут обработаны через две секунды.

Вы можете попытаться использовать рабочий поток.Допустим, вы используете очередь, в которой хранится информация о каждом элементе, который был нажат во время нажатия.Существующий поток, созданный при создании класса, получает уведомление о добавлении новых элементов в очередь.Поток получает первый элемент, обрабатывает его, обновляет пользовательский интерфейс.Если есть больше элементов, он берет следующий, обрабатывает его и т. Д. Когда больше нет элементов, поток переходит в спящий режим, пока не станут доступны новые элементы (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;
        }
     }
 }
1 голос
/ 16 мая 2011

Как насчет отключения элемента управления до завершения задания?Или отключение, когда очередь заданий достигает определенного размера?Это было бы простым решением, чтобы пользователи не нажимали слишком много.И таким образом задержка будет зависеть от эффективности вашего решения / скорости компьютера.

0 голосов
/ 16 мая 2011

То, что вы действительно хотите сделать, это что-то вроде этого:

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);
   ...
}
...