两个线程同是对办面操作会出现假死
delegate void delSelectMenu();
delegate void delSetProgressBar();
Thread thrSelectMenu = null;
Thread thrSetProgressBar = null;
private void ShowSelectMenu()
{
MytreeView.BeginInvoke(new delSelectMenu(InitMyTree));
//this.BeginInvoke(new delSelectMenu(InitMyTree));
}
private void InitMyTree()
{
B_MENU_LIST Menu_ListBLL = new B_MENU_LIST();
MytreeView.Nodes[0].Nodes.Clear();
Menu_ListBLL.SelectMenu(MytreeView.Nodes[0], "00");
}
private void SetProgressBar()
{
while (true)
{
Thread.Sleep(100);
if (thrSelectMenu.ThreadState == ThreadState.Stopped)
{
toolStripProgressBar1.Value = 100;
break;
}
else
{
if (toolStripProgressBar1.Value < 99)
{
toolStripProgressBar1.Value += 1;
}
}
}
}
private void dSetProgressBar()
{
statusStrip1.BeginInvoke(new delSetProgressBar(SetProgressBar));
//this.BeginInvoke(new delSetProgressBar(SetProgressBar));
}
private void FrmMain_Load(object sender, EventArgs e)
{
thrSelectMenu = new Thread(new ThreadStart(ShowSelectMenu));
thrSelectMenu.Start();
thrSetProgressBar = new Thread(new ThreadStart(dSetProgressBar));
thrSetProgressBar.Start();
}
当你写 ctrl.BeginInvoke(proc1) 和 ctrl.BeginInvoke(proc2) 之后,这两个方法自然是排队等待主线程调用,但是执行时自然是一先一后执行的!
如果要让界面看起来比较平滑,就要将你的两个过程内部流程细节编入BeginInvoke回调,而不是把整个过程编入。
在你的过程中,我不知道 InitMyTree 是个什么东东,这里只有3行代码,无法看出如何进行多线程设计的问题。但是对于 dSetProgressBar,它里边顶多只有while循环内部的某几行代码才要编入 BeginInvoke,而不是把整个while循环过程编入。
如果有100个过程,其中99个都已经将流程细节编入BeginInvoke了,可是有1个过程是吧它整个过程编入BeginInvoke,那么用户看起来也是这一个过程“忽然立刻”出现的,它也无法与其它99个过程交替出现。