日期:2014-05-18  浏览次数:21084 次

C#多个委托调用多个方法(优先级?)
定义了2个委托,一个用线程启动,一个用backgroundworker启动,为什么我用线程启动的委托刚开始只执行了一遍,等到用backgroundworker启动的委托执行完成后才会继续执行线程的委托?这个难道还有什么优先级?
C# code

private int i = 0;
private delegate void InvokeLabel();
private delegate void InvokeMainForm();
private void Form_Load(object sender, EventArgs e){
    Thread setLabelTextThread = new Thread(setLabelText);
    setLabelTextThread.Start();
    this.backgroundWorker.RunWorkerAsync();
}
private void setLabelText()
{
    InvokeLabel il = delegate(){
        this.lable1.Text = i++.toString();
    };
    this.Invoke(il);
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e){
    while(true){
        InvokeMainForm imf = delegate(){                
            mainForm = new MainForm();
        };
        this.Invoke(imf);    
    }        
}       


程序运行i++运行了一次,然后等到mainForm实例化后会继续执行?为什么?

------解决方案--------------------
帮顶,我也遇到同样的问题了,2个线程调用2个委托,可能都会调用,但是如果其中一个委托的执行时间很长,需要等待执行过后才会执行第二个线程的委托,有没有什么好方法可以让2个委托同时执行?
------解决方案--------------------
代码里用到了 this.Invoke ,这样他们就会转到主线程去执行,就有了先后顺序
------解决方案--------------------
C# code

this.Invoke改成this.BeginInvoke

------解决方案--------------------
探讨

我说说我要的效果吧,2个线程运行委托,一个委托在初始化界面,另一个会再一个LABEL上显示自增的数字。界面初始化结束,LABEL停止自增。感觉像进度条,但只是用文字显示。

------解决方案--------------------
Invoke就是阻塞. 阻塞是多线程编程的大忌. 只有在你确实无法使用 BegineInvoke 的时候才应该去使用 Invoke.