关于多线程操作,无法同步执行的疑惑
环境:VS2008+C#+WinForm程序
界面有一保存按钮,执行过程很费时,希望能给用户一些友好显示,自然想到要用进度条;
希望在执行主方法时,进度条也同时显示,并逐步增长的过程。现在主方法与进度条方法都已经写好,单独运行可以成功。但希望达到的效果始终无法实现。
1、进度条与主方法,都有可能涉及到对界面控件的操作,为防止出现<线程间操作无效: 从不是创建控件“”的线程访问它。>这样的错误,进度条主要代码采用了委托:
/// <summary>
/// 进度条委托方法
/// </summary>
/// <param name="ipos"></param>
private void SetProgressBarDelegate(int ipos)
{
if (this.InvokeRequired)
{
this.Invoke(new DelegateIntoInt(this.SetProgressBarDelegate), new object[] { ipos });
}
else
{
base.toolStripProgressBar1.Value = Convert.ToInt32(ipos);
}
}
/// <summary>
/// 执行主方法
/// </summary>
private void DoMainMethodDelegate()
{
if (this.InvokeRequired)
{
this.Invoke(new DelegateIntoNull(this.myMainMethod), new object[] { });
}
}
this.proBarThread = new Thread(new ThreadStart(this.SetToolStripProgressBar));
this.proBarThread.Start();
//执行主线程方法
this.mainThread = new Thread(new ThreadStart(this.DoMainMethodDelegate));
this.mainThread.IsBackground = true;//后台线程
this.mainThread.Start();
}
Backgroundworker 不是控件 如果使用它 意思一样 把你逻辑代码 写进DoWork事件处理程序 根本不需要ReportProgress
back.DoWork += DoWorkCallBack;
void DoWorkCallBack(...)
{
//处理任务1
this.Invoke((Action)delegate() //建议这儿使用 this.Invoke 不要使用 BeginInvoke 不然界面更新和实际工作进度可能不同步
{
this.ProgressBar.Value = 10;
});
//处理任务2
this.Invoke((Action)delegate()
{
this.ProgressBar.Value = 20;
});
//处理任务3
this.Invoke((Action)delegate()
{
this.ProgressBar.Value = 30;
});
// ...
}
back.RunWorkAsync();
[解决办法]
所有的控件均由 UI线程负责(也就是main进入的线程) 不需要你另外开辟线程来操作它
[解决办法]
参考这个文章的解释和实现:http://www.cnblogs.com/zhili/archive/2013/05/11/EAP.html
[解决办法]
SetToolStripProgressBar不知道你这里面做了什么?
感觉你这个 没必要用两个线程
直接在DoMainMethodDelegate 里面按进度调用?SetProgressBarDelegate就行了啊。
[解决办法]