大家好,
我以前编写了一个用BackgroundWorker处理一个导入过程的实例。
当点击“导入”按钮选择完要导入的文件后,程序将运行bkWorker.RunWorkerAsync()将导入过程交给后台线程。
那么此时我再次点击“导入”按钮,仍可以打开一个OpenFileDialog的实例。但是我刚刚编写了一个简单的窗体,发现在将更新进度条value的程序交给线程后,主线程无法像之前一样继续点击“导入”按钮。麻烦大家指导一下,多谢。public partial class Form1 : Form
{
private BackgroundWorker bkWorker = new BackgroundWorker(); public Form1()
{
InitializeComponent(); bkWorker.WorkerReportsProgress = true;
bkWorker.WorkerSupportsCancellation = true;
bkWorker.DoWork += new DoWorkEventHandler(DoWork);
bkWorker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
bkWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
} private void 开始_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "请选择要导入的文件:";
dlg.Filter = "Excel文件(*.xls)|*.xls|所有文件|*.*";
dlg.Multiselect = true; if (dlg.ShowDialog() == DialogResult.OK)
{
progressBar1.Maximum = 1000000;
bkWorker.RunWorkerAsync();
}
} private void DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 1000000; i++)
{ bkWorker.ReportProgress(i);
}
} public void ProgessChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
} public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Done!");
}
}
我以前编写了一个用BackgroundWorker处理一个导入过程的实例。
当点击“导入”按钮选择完要导入的文件后,程序将运行bkWorker.RunWorkerAsync()将导入过程交给后台线程。
那么此时我再次点击“导入”按钮,仍可以打开一个OpenFileDialog的实例。但是我刚刚编写了一个简单的窗体,发现在将更新进度条value的程序交给线程后,主线程无法像之前一样继续点击“导入”按钮。麻烦大家指导一下,多谢。public partial class Form1 : Form
{
private BackgroundWorker bkWorker = new BackgroundWorker(); public Form1()
{
InitializeComponent(); bkWorker.WorkerReportsProgress = true;
bkWorker.WorkerSupportsCancellation = true;
bkWorker.DoWork += new DoWorkEventHandler(DoWork);
bkWorker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
bkWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
} private void 开始_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "请选择要导入的文件:";
dlg.Filter = "Excel文件(*.xls)|*.xls|所有文件|*.*";
dlg.Multiselect = true; if (dlg.ShowDialog() == DialogResult.OK)
{
progressBar1.Maximum = 1000000;
bkWorker.RunWorkerAsync();
}
} private void DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 1000000; i++)
{ bkWorker.ReportProgress(i);
}
} public void ProgessChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
} public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Done!");
}
}
解决方案 »
- C#代码中要调用C++写的SOCKET通信DLL,遇到了参数传递问题!!
- 串口接收,数据库插入问题,求助
- 求解N元一次方程组(有唯一值) 的算法
- C# OUT 传参问题
- 关于PetShop3.0的问题
- 如何修改DataGrid已经绑定的数据列
- 有没有显示文件属性的控件(文件夹控件)
- 微软的VS C#觉得太庞大请推荐几个精干的C#编辑器来试试
- 用notepad写ASP.NET的C#程序行吗?让它在生成DLL时怎么才能不会出现“缺少Main方法”?
- Ctr+ Z 在C#中怎样表示?
- 求助:C#在EXCEL中怎样选取除首行外的一整列
- 优化程序时发现数据库很多连接状态为sleeping的会不会影响程序运行
progressBar1.Maximum = 100;
for (int i = 0; i < 1000000; i++)
{
if(i % 100 == 99)
bkWorker.ReportProgress(i/99);
}另外,在DoWork还未完成的情况下,再点击,似乎应该是弹出提示,或者将按钮禁用才是
如果真需要点一次弹一个,那你还是点一次开一个线程吧