C# Windows窗体进度条不工作?
我有一个按钮。它将打开一个文件并处理一个文件。我想在处理文件时显示进度条 当我在做的时候,它在工作C# Windows窗体进度条不工作?,c#,.net,winforms,C#,.net,Winforms,我有一个按钮。它将打开一个文件并处理一个文件。我想在处理文件时显示进度条 当我在做的时候,它在工作 public MainframeDataExchangeTool() { InitializeComponent(); _ProgressBar.Style = ProgressBarStyle.Marquee; _ProgressBar.Visible = false; _Random = new Random(); InitializeBackgroun
public MainframeDataExchangeTool()
{
InitializeComponent();
_ProgressBar.Style = ProgressBarStyle.Marquee;
_ProgressBar.Visible = false;
_Random = new Random();
InitializeBackgroundWorker();
}
private void InitializeBackgroundWorker()
{
_BackgroundWorker = new BackgroundWorker();
_BackgroundWorker.WorkerReportsProgress = true;
_BackgroundWorker.DoWork += (sender, e) => ((MethodInvoker)e.Argument).Invoke();
_BackgroundWorker.ProgressChanged += (sender, e) =>
{
_ProgressBar.Style = ProgressBarStyle.Continuous;
_ProgressBar.Value = e.ProgressPercentage;
};
_BackgroundWorker.RunWorkerCompleted += (sender, e) =>
{
if (_ProgressBar.Style == ProgressBarStyle.Marquee)
{
_ProgressBar.Visible = false;
}
};
}
在我的按钮点击我正在做
private void btnOpenScriptFile_Click(object sender, EventArgs e)
{
try
{
loadScriptFlDlg.Filter = Constants.SCRIPT_FILE_FILTER;
loadScriptFlDlg.FilterIndex = 3;
loadScriptFlDlg.RestoreDirectory = true;
loadScriptFlDlg.FileName = string.Empty;
DialogResult objDialogResult = loadScriptFlDlg.ShowDialog();
if (objDialogResult.Equals(DialogResult.OK))
{
_BackgroundWorker.RunWorkerAsync(new MethodInvoker(() =>
{
_ProgressBar.BeginInvoke(new MethodInvoker(() => _ProgressBar.Visible = true));
for (int i = 0; i < 100; i++)
{
Thread.Sleep(10);
_BackgroundWorker.ReportProgress(i);
}
}));
EnableDisableControls("OpenScript");
string strScriptError = LoadScriptFromFile(loadScriptFlDlg.FileName);///loading will taking time but progress bar not showing
private void btnOpenScriptFile\u单击(对象发送方,事件参数e)
{
尝试
{
loadScriptFlDlg.Filter=Constants.SCRIPT\u FILE\u Filter;
loadScriptFlDlg.FilterIndex=3;
loadScriptFlDlg.RestoreDirectory=true;
loadScriptFlDlg.FileName=string.Empty;
DialogResult objDialogResult=loadScriptFlDlg.ShowDialog();
if(objDialogResult.Equals(DialogResult.OK))
{
_BackgroundWorker.RunWorkerAsync(新方法调用程序(()=>
{
_ProgressBar.BeginInvoke(新方法调用程序(()=>\u ProgressBar.Visible=true));
对于(int i=0;i<100;i++)
{
睡眠(10);
_后台工作人员报告进度(一);
}
}));
启用禁用控件(“OpenScript”);
string strScriptError=LoadScriptFromFile(loadScriptFlDlg.FileName);///加载需要时间,但进度条不显示
基本上进度条是在数据加载结束时显示的,但在加载数据时却没有显示进度条令人惊讶的是,编译器没有抛出一个嘶嘶的匹配…因为您需要一个额外的} 打开4个嵌套级别,但仅关闭3个 我已修改了您的代码,如下所示:
private void btnOpenScriptFile_Click(object sender, EventArgs e)
{
try
{
if (objDialogResult.Equals(DialogResult.OK))
{
_ProgressBar.Style = ProgressBarStyle.Marquee;
_ProgressBar.BeginInvoke(new MethodInvoker(() => _ProgressBar.Visible = true));
for (int i = 0; i < 100; i++)
{
Thread.Sleep(10);
_ProgressBar.BeginInvoke(new Action(() => _ProgressBar.Value = i));
//Process my file here
}
}
}
Catch
{
}
}
在您的
_BackgroundWorker.ReportProgress(i);
为什么?代码将一直保留在for循环中,直到完成。通过执行“doevents”,您告诉它在下一个循环之前进行外部更新
如果没有'doevents',我想你只能看到0和100。令人惊讶的是,编译器没有抛出一个嘶嘶的匹配…因为你需要一个额外的} 打开4个嵌套级别,但仅关闭3个 我已修改了您的代码,如下所示:
private void btnOpenScriptFile_Click(object sender, EventArgs e)
{
try
{
if (objDialogResult.Equals(DialogResult.OK))
{
_ProgressBar.Style = ProgressBarStyle.Marquee;
_ProgressBar.BeginInvoke(new MethodInvoker(() => _ProgressBar.Visible = true));
for (int i = 0; i < 100; i++)
{
Thread.Sleep(10);
_ProgressBar.BeginInvoke(new Action(() => _ProgressBar.Value = i));
//Process my file here
}
}
}
Catch
{
}
}
在您的
_BackgroundWorker.ReportProgress(i);
为什么?代码将一直保留在for循环中,直到完成。通过执行“doevents”,您告诉它在下一个循环之前进行外部更新
如果没有'doevents',我想你只能看到0和100。你看不到进度,因为UI线程无法更新UI,因为它正忙于加载你的文件。你必须从后台工作程序调用
LoadScriptFromFile
,并保持UI线程空闲以处理事件和更新UI。你看不到进度,因为UI线程无法更新UI,因为它正忙于加载您的文件。您必须从后台工作程序调用LoadScriptFromFile
,并保持UI线程空闲以处理事件和更新UI。我在项目中使用了2种方法(示例):
1*调用(新操作(()=>_ProgressBar.Visible=true))
2*或者在您的
\u BackgroundWorker.ReportProgress(i)之后使用Application.DoEvents()
;
我在我的项目中使用了两种方法(示例):
1*调用(新操作(()=>_ProgressBar.Visible=true))
2*或者在您的
\u BackgroundWorker.ReportProgress(i);
之后使用Application.DoEvents()
,只需对BackgroundWorker(bgw)执行类似操作即可
确保将BackgroundWorker的“WorkerReportsProgress”属性设置为True!只需对BackgroundWorker(bgw)执行类似操作即可
确保设置BackgroundWorker的“WorkerReportsProgress”属性设置为True!我倾向于在c#中使用backgroundworker的进度条。你尝试过吗?是的,我尝试过,但我的问题是它会以相同的形式工作吗?不理解你的问题-这里有一个链接@DanielCasserly谢谢…我已经更新了我的问题…你能帮我解决这个问题吗same@defaultlocale如果你想撞上老奎要删除标签,请解决其他问题(大写等)同样。我倾向于在c#中使用backgroundworker的进度条。你尝试过吗?是的,我尝试过,但我的问题是它是否以相同的形式工作。我不明白你的问题-这里有一个链接@DanielCasserly谢谢…我更新了我的问题…你能帮我吗same@defaultlocale如果你想问rem一些老问题ove标签,请解决其他问题(大写等)还有…我的错,我只是发布了我的代码的prtt…我已经更新了…你能帮我吗…我的错,我只是发布了我的代码的prtt…我已经更新了…你能帮我吗…我非常明白你的意思…你能帮我编写一个示例代码吗…即使我尝试了,我得到了跨线程错误..提前谢谢你的代码在
LoadScriptFromFile
,读取文件时,调用\u BackgroundWorker.ReportProgress()
。如果您想从LoadScriptFromFile
的内部更改控件,那么您应该使用您的控件。调用
并从传递给调用的委托启用/禁用该控件。
…我非常明白您的意思…您能帮我编写一个示例代码吗…即使我尝试了跨线程错误或者..提前感谢您在LoadScriptFromFile
中的代码是什么?除了加载文件之外,它是否还更改了任何控件?您可能需要重新考虑它。是的..它的启用/禁用控件…在出现错误的地方,您应该从后台工作人员调用LoadScriptFromFile
,并且在读取文件时,调用\u BackgroundWorker.ReportProgress()
。如果要从LoadScriptFromFile
内部更改控件,则应使用控件。调用
并启用/禁用从传递到调用的委托的控件。