2012-11-20 32 views
3

如何解决此问题?Backgroundworker,未运行进度条

我期待进度条中的过程,直到进程是做

这里加载是我的代码:

private void btnProcess_Click(object sender, EventArgs e) 
    { 
     backgroundWorker.WorkerReportsProgress = true; 
     backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged; 
     backgroundWorker.DoWork += backgroundWorker_DoWork; 

     backgroundWorker.RunWorkerAsync(); 
    } 

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //start transaction 
     DoTransaction(); 
    } 

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

我的交易功能:

private void DoTransaction() 
    { 
     string pathIdentifier; 
     pathIdentifier = func.checkthePathFile(); 
     if (pathIdentifier == null) 
     { 
      MessageBox.Show("Path has no yet been specified!"); 
     } 
     else 
     { 
      //create xml base from user inputs 
      XElement transactXML = new XElement("Transaction", 
       new XElement("CardNumber", txtCardNum.Text.Trim()), 
       new XElement("ExpireDate", txtExpDate.Text.Trim()), 
       new XElement("Cardtype", txtCardType.Text.Trim()) 
       ); 

      //save xml to a file 
      transactXML.Save(pathIdentifier + "/sample.xml"); 
     } 
    } 

回答

3

如何运行应该知道你的流程有多远?

您需要通过从后台操作调用backgroundWorker.ReportProgress来告诉它。这里没有魔法。

MSDN:http://msdn.microsoft.com/en-us/library/ka89zff4.aspx

打破你的过程变成有意义的片段和ReportProgress只要它是有道理这样做。

public void DoTransaction() 
{ 
    part1(); 
    backgroundWorker.ReportProgress(25); 

    part2(); 
    backgroundWorker.ReportProgress(50); 

    part3(); 
    backgroundWorker.ReportProgress(75); 

    part4(); 
    backgroundWorker.ReportProgress(100); 
} 

编辑基于交易的过帐()函数

如果您不是在编写多线程程序有信心,那么就不要尝试编写多线程程序时,甚至一个BackgroundWorker的帮助下试图从你那里抽取一些细节。

的几个问题:

您提供Transaction()方法尝试从后台线程启动MessageBox和阅读各种控件的Text财产。这将导致问题,因为当从除创建它们的线程之外的线程访问UI元素时,运行时通常会抛出异常。

如果你真的想要做的XML在BackgroundWorker节省,你应该验证文件名和目录,并建立BackgroundWorker并调用RunWorkerAsyncText特性保存到一个中间对象。

此外,在我看来,你的Transaction方法不会是足够的时间来真正担保后台线程。即使是一台相对较旧的PC,也可以创建并保存15个元素的XML文件,而不会眨眼。运行时可能会浪费更多时间在线程之间编组数据,而不是简单地将文件写入磁盘。只需在按钮单击事件处理程序中完成您的工作。

+0

谢谢,我更新了我的问题,我把什么交易功能包含在那里我应该把它知道吗?我只是将4个数据放在创建xml中,但实际上是15个数据。:) – GrayFullBuster

1

需要对BackgroundWorker实例进行一些参考。在实例化它时通过类的引用。
实例这样

BackgroundWorker worker = sender as BackgroundWorker; 


然后调用这样

`worker.ReportProgress(...)` 
+0

谢谢,我更新了我的问题,我把什么事务功能包含哪里应该知道?我只是将4个数据放在创建xml中,但实际上是15个数据。 :) – GrayFullBuster