C#forms:progressbar不';不显示正在工作的线程的更新 问题

C#forms:progressbar不';不显示正在工作的线程的更新 问题,c#,.net,forms,user-interface,C#,.net,Forms,User Interface,如何在一个线程中工作并在主线程上更新progressbar 总结 下面是我试图解决的问题,但它不起作用。我认为原因是更新在Windows消息泵中排队,但随后所有更新都立即执行,因此更新发生得如此之快,以至于用户看不到它们 细节 我正在尝试创建一个GUI应用程序,它可以在后台处理线程并更新progressbar。我意识到使用backgroundworkerprocess会更简单,但这会剥夺我所需要的一些灵活性 我使用invokererequired和callback函数来处理从工作线程到主线程的调

如何在一个线程中工作并在主线程上更新progressbar

总结 下面是我试图解决的问题,但它不起作用。我认为原因是更新在Windows消息泵中排队,但随后所有更新都立即执行,因此更新发生得如此之快,以至于用户看不到它们

细节 我正在尝试创建一个GUI应用程序,它可以在后台处理线程并更新progressbar。我意识到使用backgroundworkerprocess会更简单,但这会剥夺我所需要的一些灵活性

我使用invokererequired和callback函数来处理从工作线程到主线程的调用,因此线程安全不应该成为问题

在我的电脑上,当我单击按钮1时,工作线程大约需要5秒钟才能完成工作并将结果输出到textbox1。在此期间,工作线程对updateProgressBar函数进行大约100次调用。此函数正在执行:

progressBar1.Value = percent;
progressBar1.Update();
progressBar1.Refresh();
progressBar1.Invalidate();
但是,用户从未看到这些命令的效果。我相信它们都会被放入消息泵来更新GUI,但它们只是排队并立即执行

我尝试过在工作流程中加入睡眠和玩耍,但都并没有起到任何作用。如何刷新progressbar更新

请注意,这是一个人为的例子来说明这个问题

代码
//Form1.cs
使用制度;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用系统线程;
使用System.Text.RegularExpressions;
名称空间进程示例
{
公共部分类Form1:Form
{
螺纹加工螺纹;
委托void updateGUICallback(int read,int unread);
委托无效updateProgressBarCallback(整数百分比);
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
字符串输入=“abc1234 123456域\abc1234 123 0\r\n”;
//创建1048576行输入
对于(int i=0;i<20;i++)
输入+=输入;
processThread=新线程(新的参数化ThreadStart(processData));
processThread.Start(输入);
}
私有void processData(对象输入)
{
//在换行符上断开输入
string[]line=Regex.Split((字符串)输入,“\r\n”);
int readLines=0;
int unreadLines=0;
int maxLines=lines.Length;
//正则表达式的设置
匹配;
字符串模式=@“^(\S+)\S+(\S+)\S+(\S+)\S+(\S+)\S+(\S+)”;
//阅读每一行输入
对于(int i=0;i
在您精心设计的示例中,这可能是巧合,但行

updateProgressBar(i / maxLines);
应该读作

updateProgressBar(100 * i / maxLines);
使用Windows窗体设计器的默认设置时。我刚刚检查了它的修改和进度栏定期更新,正如你(可能)希望它


话虽如此,使用
Invoke()。这解决了我的问题(真不敢相信我错过了)。
updateProgressBar(100 * i / maxLines);