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

标签 c# .net mysql winforms backgroundworker

我正在 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/

相关文章:

php - 每周编制年度工作规模,无需连续工作两周

c# - 将 Mac XML PList 解析为可读的内容

mysql - 如何使用 DataRow 更新数据库?

c# - 命名空间问题不明确,即使在删除以前的控制之后

c# - 有没有办法表示很长的数字?

c# - 扩展 C# 中的现有结构以添加运算符

java - 创建一个表并将数据插入数据库不能正常使用 mysql 和 java jdbc

java - mysql 运行时异常

c# - JSON.NET - 识别嵌套数组

c# - 派生自实现接口(interface)的基类