backgroundworker没有从另一个班级获得进度信息

时间:2012-06-21 20:14:34

标签: c# class user-interface backgroundworker exchange-server

我点击按钮后调用它:

FORM1码:

{

   ProgressBar.Maximum = 500;    
   myArguments gifargs = new myArguments();    //class for passing arguments to the bgW    
   gifargs.InputFilePath = listBox1.SelectedItem.ToString(); // input filepath    
   gifargs.OutputFilePath = saveFileDialog1.FileName;        //output filepath    
   backgroundWorker1.RunWorkerAsync(gifargs);                // run bgW async with args   
}


// here is bgW doWork
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)   
{   
myArguments args = e.Argument as myArguments; //myArguments class
if (backgroundWorker1.CancellationPending)    
{
  e.Cancel = true;
}
PictureHandler makeAnimatedGIf = new PictureHandler(); // creating new object    
makeAnimatedGIf.imageGif(args.InputFilePath,args.OutputFilePath); //call method with args

makeAnimatedGIf.GifProgress += new PictureHandler.myprogressgetter(this.GifProgressF1);

//add the delegate

直到这里才能完美

这是我的Callback函数,它应该更新bgW.ReportProgress

但它永远不会到达那里?!

private void GifProgressF1(int i)
{
             System.Threading.Thread.Sleep(500);
            backgroundWorker1.ReportProgress(i);
}

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

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
           ProgressBar.Value = 0;
            if (e.Cancelled)
            {
                MessageBox.Show("Process canceled!");
            }
            else
            {
                MessageBox.Show("Process complete!");
            }

        }

< ---- Picturehandler.cs码----->

//在Picturehandler类中委托定义

public delegate void myprogressgetter(int i);

public myprogressgetter GifProgress;








public void imageGif(string input, string output)
    {
        Process imagemagick = new Process();
        imagemagick.StartInfo.FileName = "convert.exe";
        imagemagick.StartInfo.Arguments = "-monitor -delay 1 " + input + " +map " + output;
        imagemagick.EnableRaisingEvents = false;
        imagemagick.StartInfo.UseShellExecute = false;
        imagemagick.StartInfo.CreateNoWindow = true;
        imagemagick.StartInfo.RedirectStandardOutput = true;
        imagemagick.StartInfo.RedirectStandardError = true;
        imagemagick.Start();
        StreamReader ima = imagemagick.StandardError;
        bool assign2 = false;

        do
        {
            string consolausgabe = ima.ReadLine();
            if (consolausgabe.Contains("Reduce") == true)
            {
                assign2 = true;
            }
            gifprocess(consolausgabe, assign2);

        } while (!ima.EndOfStream);
        imagemagick.WaitForExit();
        imagemagick.Close();
    }

 private void gifprocess(string cline, bool zähl)
    {
        if (cline.Contains("Load"))
        {
            string a1 = cline;
            string[] a11 = a1.Split(new char[] { ':', ',' });
            string a12 = a11[3];
            string[] a13 = a12.Split(new char[] { '%' });
            int load1 = Convert.ToInt32(a13[0]);
            GifProgress(load1;)  //<<<<<------------- this will give me an exception
            // Visual Studio says GifProgress = null in Autos

}

现在,如果我调用GifProgress(100)或任何其他整数,我会得到异常(对象引用未设置为对象的实例。),进度条永远不会更新。

来自图片处理程序类的进度信息不会进入用户界面,我现在试了两天。

我使用相同的代码从form2获取textbox.text并且回调函数工作得很好。 WorkerReportProgress = TRUE。

4 个答案:

答案 0 :(得分:1)

通常,您的DoWork方法会有一个循环。循环的每次迭代都可以通过调用ReportProgress来完成,这将导致ProgressChanged中的内容运行。

由于您只是运行几行代码,因此请使用RunWorkerCompleted设置进​​度指示器并完全忘记ReportProgress

这是一个tutorial我曾经更好地理解BackgroundWorker,如果它有帮助......

除非你正在做你正在做的事情,因为你的后台工作者线程在makeAnimatedGIf.imageGif完成任务之前退出...

答案 1 :(得分:0)

确保BackgroundWorker的WorkerReportsProgress属性设置为true。默认为false

答案 2 :(得分:0)

确保将WorkerReportsProgress设置为true并使用Invoke()从另一个线程更新进度条。

答案 3 :(得分:0)

您希望调用的函数GifProgressF1仅作为“PictureHandler”类实例的回调引用。那个回调的地点和方式完全取决于那个类。但是根据你的描述,不清楚这个类来自何处或它的作用。我建议引用类文档或源代码,以确切地找到应该调用此回调的时间并从那里开始。