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?除了加载文件外,它是否还更改了任何控件?您可能需要重新计算它。是的..它的启用/禁用控件…当我遇到错误时,您应该从后台工作程序调用
LoadScriptFromFile
,读取文件时,调用
\u BackgroundWorker.ReportProgress()
。如果您想从
LoadScriptFromFile
的内部更改控件,那么您应该使用
您的控件。调用
并从传递给
调用的委托启用/禁用该控件。
…我非常明白您的意思…您能帮我编写一个示例代码吗…即使我尝试了跨线程错误或者..提前感谢您在
LoadScriptFromFile
中的代码是什么?除了加载文件之外,它是否还更改了任何控件?您可能需要重新考虑它。是的..它的启用/禁用控件…在出现错误的地方,您应该从后台工作人员调用
LoadScriptFromFile
,并且在读取文件时,调用
\u BackgroundWorker.ReportProgress()
。如果要从
LoadScriptFromFile
内部更改控件,则应使用
控件。调用
并启用/禁用从传递到
调用的委托的控件。