Windows 窗体线程和事件 - ListBox 及时更新,但进度条遇到巨大延迟

标签 windows multithreading events forms delegates

我们的团队正在创建一个新的招聘工作流程系统来取代旧系统。我的任务是将旧数据迁移到新模式中。我决定通过创建一个小型 Windows 窗体项目来实现这一点,因为架构完全不同,而且直接的 TSQL 脚本不是一个合适的解决方案。

完成工作的主要密封类“ImportController”声明了以下委托(delegate)事件:

public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;

主窗口使用新线程启动该类中的静态方法:

Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);

ImportProgressEvent 参数包含一个字符串消息、一个进度条的最大整数值和一个当前进度整数值。 Windows窗体订阅事件:

ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent);

并使用自己的委托(delegate)以这种方式响应事件:

    private delegate void TaskCompletedUIDelegate(string completedTask, int currentProgress, int progressMax);

private void ImportController_importProgressEvent(object sender, ImportProgressEventArgs e)
            {
                this.Invoke(new TaskCompletedUIDelegate(this.DisplayCompletedTask), e.CompletedTask, e.CurrentProgress, e.ProgressMax);
            }

最后更新进度条和列表框:

private void DisplayCompletedTask(string completedTask, int currentProgress, int progressMax)
        {
            string[] items = completedTask.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string item in items)
            {
                this.lstTasks.Items.Add(item);
            }

            if (currentProgress >= 0 && progressMax > 0 && currentProgress <= progressMax)
            {
                this.ImportProgressBar.Maximum = progressMax;
                this.ImportProgressBar.Value = currentProgress;
            }
        }

问题是 ListBox 似乎更新得很快,但是进度条永远不会移动,直到批处理几乎完成为止???什么给了?

最佳答案

也许你可以试试 BackgroundWorker 组件。它使线程更容易。这里的例子:

关于Windows 窗体线程和事件 - ListBox 及时更新,但进度条遇到巨大延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12095/

相关文章:

javascript - angular中如何通过@Input和@Output获取Id

windows - 类未注册 HRESULT 0x80040154

c++ - win32 c++ 我想在 STATIC 标签的 TEXT 之后直接插入一个 EDIT 控件

Python 2.7 32 位安装在 Win 7 : No registry keys?

java - 如何同步文件明智的文件编写器对象?

multithreading - goroutine和thread的区别

c - Windows Lua 到可执行文件

android - Android 应用程序中的线程

c# - C# 上的异步事件最佳实践混淆

objective-c - 没有 UIControls 响应用户事件