如何解决此问题?
我希望在进程中加载进度条,直到进程完成
这是我的代码:
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");
}
}
答案 0 :(得分: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元素时,运行时通常会抛出异常。
如果你真的想在BackgroundWorker
中进行XML保存,你应该验证文件名和目录,并在设置Text
之前将BackgroundWorker
属性保存到中间对象并致电RunWorkerAsync
。
此外,在我看来,您的Transaction
方法不会耗费足够的时间来真正保证后台线程。即使是相对较旧的PC也能够以比闪烁更快的速度创建和保存15个元素的XML文件。运行时可能会浪费更多时间在线程之间编组数据,而不是简单地将文件写入磁盘。只需在按钮单击事件处理程序中完成工作。
答案 1 :(得分:1)
需要对BackgroundWorker实例的一些引用。在实例化时传递对类的引用 像这样实例化
BackgroundWorker worker = sender as BackgroundWorker;
然后像这样打电话
`worker.ReportProgress(...)`