Использование BackgroundWorker для получения сведений о последнем выбранном элементе из списка - PullRequest
0 голосов
/ 21 ноября 2011

В моем приложении у меня есть DataGrid, который заполняется из базы данных.Когда я щелкаю один из элементов, его данные извлекаются и передаются в пользовательский интерфейс.Получение информации об элементе является простой операцией, поэтому я использую BackgroundWorker для ее обработки.Когда я выбираю другой элемент во время поиска, я хотел бы прервать текущую операцию и запустить другой, используя новый идентификатор элемента.Какой лучший способ сделать это?Я пытался поместить это в DataGrid CellContentClick hanlder:

if(worker.IsBusy)
{
    worker.CancelAsync();
}

, но всегда получаю информацию о первом выбранном элементе.

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Хорошо, я понял это сам. Во-первых, я разбросал следующие блоки по всему обработчику worker_DoWork:

if(worker.CancellationPending)
{
    e.Cancel = true;
    return;
}

Я также запретил выполнение worker.RunWorkerAsync (), когда worker.CancellationPending имеет значение true. Для достижения моей цели я добавил следующий код в мой обработчик RunWorkerCompleted:

if(!e.Cancelled)
{
    //update UI
}
else
{
    //retrieve details of new item
}
1 голос
/ 21 ноября 2011

Звучит так, будто вы не проверяете BackgroundWorker.CancellationPending при получении данных элемента.

Вам нужно будет сделать что-то вроде этого:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        // Do not access the form's BackgroundWorker reference directly.
        // Instead, use the reference provided by the sender parameter.
        BackgroundWorker bw = sender as BackgroundWorker;

        // Extract the argument.
        int arg = (int)e.Argument;

        // Start the time-consuming operation.
        e.Result = TimeConsumingOperation(bw, arg);

        // If the operation was canceled by the user, 
        // set the DoWorkEventArgs.Cancel property to true.
        if (bw.CancellationPending)
        {
            e.Cancel = true;
        }
    }

См. Также Как: выполнить операцию в фоновом режиме .

Возможно, вы хотите поместить несколько проверок для CancellationPending в свой асинхронный код, по одной после каждого шага, который занимает значительное количествовремени.

...