1

ボタンがあります。ファイルを開き、ファイルを処理します。ファイルの処理中に進行状況バーを表示したい。

私がやっているとき.その作業

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

基本的に、進行状況バーはデータの読み込みの最後に表示されますが、データの読み込み中は表示されません

4

4 に答える 4

1

ファイルの読み込み中のため、UI スレッドが UI を更新できないため、進行状況を確認できません。イベントを処理して UI を更新するには、バックグラウンド ワーカーから呼び出しLoadScriptFromFile、UI スレッドを解放しておく必要があります。

于 2013-10-08T11:22:52.093 に答える
0

BackgroundWorker (bgw) でこのようなことを行うだけです。

    private void MyMethod()
    {
        bgw.RunWorkerAsync(); //this calls the DoWork event
    }

    private void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        //Expensive task
        //Calculate how far you through your task (ie has read X of Y bytes of file)
        bgw.ReportProgress(myInteger);
    }

    private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        myProgressBar.Value = e.ProgressPercentage;
    }

BackgroundWorker の「WorkerReportsProgress」プロパティを True に設定してください。

于 2013-10-16T18:15:33.613 に答える
0

私はこれを私のプロジェクトで2つのメソッド(例)で使用しました:

1* Invoke(new Action(() => _ProgressBar.Visible = true));

2* またはApplication.DoEvents()あなたの後に使用_BackgroundWorker.ReportProgress(i);

于 2013-10-08T11:32:10.653 に答える