使用BackgroundWorker从列表中检索最后选定项的详细信息
本文关键字:详细信息 最后 检索 BackgroundWorker 列表 使用 | 更新日期: 2023-09-27 18:15:28
在我的应用程序中,我有一个从数据库填充的DataGrid。当我单击其中一个项时,它的详细信息将被检索并传递给UI。获取项目的详细信息是一个昂贵的操作,所以我使用BackgroundWorker来处理它。当我在检索过程中选择另一个项目时,我希望中止当前操作并使用新的项目id开始另一个操作。最好的方法是什么?我试着把这个放在DataGrid CellContentClick处理程序:
if(worker.IsBusy)
{
worker.CancelAsync();
}
但我总是得到第一个选择项目的详细信息
听起来你没有检查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
}