gpt4 book ai didi

c# - BackgroundWorker 问题(C# Windows 窗体)

转载 作者:行者123 更新时间:2023-11-29 01:14:53 25 4
gpt4 key购买 nike

我正在 MSDN 上阅读有关 BackgroundWorker 类的内容,我对它的工作原理有疑问。

下面的代码中有一个for 循环。在 for 循环中,在 else 子句中,您应该:

Perform a time consuming operation and report progress.

但是,为什么会有一个for循环,为什么它的最大值只有10?

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;

for (int i = 1; (i <= 10); i++)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
worker.ReportProgress((i * 10));
}
}
}

我有一个非常庞大的数据库,有时根据特定标准检查新订单最多需要一分钟。我不想猜测完成查询可能需要多长时间,我想要实际进展。我如何让这个后台工作人员根据 MySQL SELECT 查询报告进度?

最佳答案

How can I make this background worker report progress based on a MySQL SELECT query?

你不能。这是同步方法调用的问题之一,您无法提前预测它需要多长时间。你有两个时间点要处理。在调用方法之前和调用方法之后。你不会在两者之间得到任何东西。该方法要么已返回,要么未返回。

不过,您可以利用统计数据来发挥自己的优势。您可以记录每次执行、存储并使用它来计算预测所需的时间,但它永远不会准确。有了这样的预测,您可以相应地间隔进度报告,以便您最终 100% 达到或接近您计算出的统计预测。

但是,如果数据库比平时慢或快,它就会关闭。

另请注意,调用 MySQL 以检索数据的线程不能与报告进度的线程相同,因为它将“等待”MySQL 数据库和与之通信的 .NET 代码以返回数据,全部在一 block 。您需要启动另一个线程来报告进度。

关于c# - BackgroundWorker 问题(C# Windows 窗体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5355523/

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