gpt4 book ai didi

c# - 复用一个BackgroundWorker,取消等待

转载 作者:太空狗 更新时间:2023-10-30 00:16:28 24 4
gpt4 key购买 nike

假设您有一个搜索文本框,并且有一个搜索算法附加到 TextChanged 事件,该事件与 BackgroundWorker 一起运行。如果文本框中出现新字符,我需要取消之前的搜索并重新运行。

我尝试在主线程和 bgw 之间使用事件,来自 this previous question , 但我仍然收到错误消息“当前正忙,无法同时运行多个任务”

    BackgroundWorker bgw_Search = new BackgroundWorker();
bgw_Search.DoWork += new DoWorkEventHandler(bgw_Search_DoWork);

private AutoResetEvent _resetEvent = new AutoResetEvent(false);

private void txtSearch_TextChanged(object sender, EventArgs e)
{
SearchWithBgw();
}

private void SearchWithBgw()
{
// cancel previous search
if (bgw_Search.IsBusy)
{
bgw_Search.CancelAsync();

// wait for the bgw to finish, so it can be reused.
_resetEvent.WaitOne(); // will block until _resetEvent.Set() call made
}

// start new search
bgw_Search.RunWorkerAsync(); // error "cannot run multiple tasks concurrently"
}

void bgw_Search_DoWork(object sender, DoWorkEventArgs e)
{
Search(txtSearch.Text, e);
}

private void Search(string aQuery, DoWorkEventArgs e)
{
int i = 1;
while (i < 3) // simulating search processing...
{
Thread.Sleep(1000);
i++;

if (bgw_Search.CancellationPending)
{
_resetEvent.Set(); // signal that worker is done
e.Cancel = true;
return;
}
}
}

编辑以反射(reflect)答案。不要重用 BackgroundWorker,创建一个新的:

    private void SearchWithBgw()
{
if (bgw_Search.IsBusy)
{
bgw_Search.CancelAsync();
_resetEvent.WaitOne(); // will block until _resetEvent.Set() call made

bgw_Search = new BackgroundWorker();
bgw_Search.WorkerSupportsCancellation = true;
bgw_Search.DoWork += new DoWorkEventHandler(bgw_Search_DoWork);
}

bgw_Search.RunWorkerAsync();
}

最佳答案

当 _resetEvent.WaitOne() 调用完成时,工作线程实际上并未完成。它正忙于从 DoWork() 返回并等待运行 RunWorkerCompleted 事件的机会(如果有)。这需要时间。

没有可靠的方法来确保 BGW 以同步方式完成。在 IsBusy 上阻塞或等待 RunWorkerCompleted 事件运行将导致死锁。如果您真的只想使用一个 bgw,那么您将不得不对请求进行排队。或者只是不要为小事出汗并分配另一个 bgw。它们的成本非常很少。

关于c# - 复用一个BackgroundWorker,取消等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7044938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com