![](/img/trans.png)
[英]Running a method in BackGroundWorker and Showing ProgressBar
[英]Backgroundworker, not running the progressbar
我该如何解决这个问题?
我期待进度条在进程中加载,直到进程完成
这是我的代码:
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");
}
}
运行时如何知道您的进程有多远?
您需要通过从后台操作调用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);
}
根据发布Transaction()函数进行编辑
如果您对编写多线程程序没有信心,那么即使借助于试图从您那里抽象出一些细节的BackgroundWorker,也不要尝试编写多线程程序。
一些问题:
您提供的Transaction()
方法尝试启动MessageBox
并从后台线程中读取各种控件的Text
属性。 这将导致问题,因为当从创建它们的线程以外的线程访问UI元素时,运行时通常会抛出异常。
如果您确实想在BackgroundWorker
进行XML保存,则应在设置BackgroundWorker
并调用RunWorkerAsync
之前验证文件名和目录,并将Text
属性保存到中间对象。
此外,在我看来,您的Transaction
方法不会足够时间来真正保证后台线程。 即使是相对较旧的PC也能够以比闪烁更快的速度创建和保存15个元素的XML文件。 运行时可能会浪费更多时间在线程之间编组数据,而不是简单地将文件写入磁盘。 只需在按钮单击事件处理程序中完成工作即可。
需要对BackgroundWorker实例的一些引用。在实例化时传递对类的引用。
像这样实例化
BackgroundWorker worker = sender as BackgroundWorker;
然后像这样打电话
`worker.ReportProgress(...)`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.