C#Backgroundworker ReportProgress()未执行

问题描述 投票:0回答:1

你好,我试图填充进度条,但由于某些原因,ReportProgress调用未执行。

这是我的代码

    //create status_Worker
    status_Worker = new BackgroundWorker();
    status_Worker.DoWork += new DoWorkEventHandler(Status_DoWork);
    status_Worker.ProgressChanged += new ProgressChangedEventHandler(Worker_ProgressChanged);
    status_Worker.WorkerReportsProgress = true;
    status_Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);

    private void Status_DoWork(object sender, DoWorkEventArgs e)
    {
        //make call to Logger class getStatus method
        _logger.getStatus(sender);
    }

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

    private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            MessageBox.Show(e.Error.Message);
            return;
        } 
        else
        {
            Start_button.IsEnabled = true;
        }

    }

    private void Start_button_Click(object sender, RoutedEventArgs e)
    {
        //initiate status_Worker when button is clicked
        status_Worker.RunWorkerAsync();
        Start_button.IsEnabled = false;
    }

现在在Logger类中,我具有getStatus()方法。我打电话到本地服务器以获取文件状态,这些文件都已处理并且可以正常工作,我在MainWindow.Status上看到值已自动更新。

    public async Task getStatus(object sender)
    {
        BackgroundWorker statusWorker = (BackgroundWorker)sender;
        //Making a call to ReportProgress here works and it shows the progress bar
        //statusWorker.ReportProgress(99);

        //REQUEST STATUS from a server
        //Status format
        //CurrentParser, NumberOfFilesToParse,CountOfCompletedFiles,Status, NumberOfProcessRunning
        int CountOfCompletedFiles;
        int NumberOfFilesToParse;
        int percent;
        string status = "Running";
        string[] stats;
        char[] delimiterChars = { ' ', ',', '.', ':', '\t' };

        while(status!="Complete")
        {

            var getstatus = await request.GetStringAsync("http://localhost:8085/status");
            logs.Add(getstatus);
            stats = getstatus.Split(delimiterChars);
            NumberOfFilesToParse = Int32.Parse(stats[1]);
            CountOfCompletedFiles = Int32.Parse(stats[2]);
            status = stats[3];

            Thread.Sleep(1000);
            MainWindow.main.Status = "Files to process: " + NumberOfFilesToParse + " Files completed: " + CountOfCompletedFiles + " Status: " + status;

            if(NumberOfFilesToParse!=0 && status!="Complete")
            {
                percent = (CountOfCompletedFiles * 100) / NumberOfFilesToParse;
                //a call to ReportProgress here stalls the program at this point
                //statusWorker.ReportProgress(percent);
            }

        }
        MainWindow.main.Status = "Completed!";

    }

在getStatus方法开始时对ReportProgress的调用有效,但是在while循环期间或之后对ReportProgress的调用会导致此时的进程停滞。即使使用静态数字ReportProgress(99),它也只能在开头执行]

你好,我试图填充进度条,但由于某些原因,ReportProgress调用未执行。这是我的代码//创建status_Worker status_Worker = new BackgroundWorker(); ...

c# progress-bar backgroundworker reportprogress
1个回答
1
投票

您的Status_DoWork方法正在执行即弃操作。它正在调用async Task方法,然后忽略它返回的Task

© www.soinside.com 2019 - 2024. All rights reserved.