使用BackgroundWorker从列表中检索最后选定项的详细信息

本文关键字:详细信息 最后 检索 BackgroundWorker 列表 使用 | 更新日期: 2023-09-27 18:15:28

在我的应用程序中,我有一个从数据库填充的DataGrid。当我单击其中一个项时,它的详细信息将被检索并传递给UI。获取项目的详细信息是一个昂贵的操作,所以我使用BackgroundWorker来处理它。当我在检索过程中选择另一个项目时,我希望中止当前操作并使用新的项目id开始另一个操作。最好的方法是什么?我试着把这个放在DataGrid CellContentClick处理程序:

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

但我总是得到第一个选择项目的详细信息

使用BackgroundWorker从列表中检索最后选定项的详细信息

听起来你没有检查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进行多次检查,每一步都需要花费大量时间。

好吧,我自己弄明白了。首先,我在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
}