委托可以认为就是一个函数的入口.所以谁调用,占用谁的资源. 如下代码:
{
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString() + "----Func1 :" + iValue.ToString());
System.Threading.Thread.Sleep(1000);
}
private void button1_Click(object sender, EventArgs e)
{
dlgtFunc1 DLGTFunc = new dlgtFunc1(Func1);
DLGTFunc(0);
DLGTFunc(1);
}
输出如下:
11/15/2007 8:39:12 PM----Func1 :0
11/15/2007 8:39:13 PM----Func1 :1
结果肯定是 顺序 的,而且相差1s. 因为调用函数就是这样的:)
再来看一个例子.
我们开启一个线程,用于刷新一个界面上的BUTTON.最后退出时,用标志变量等待退出线程.感觉没有任何问题:)
{
System.Diagnostics.Debug.WriteLine("Func0 Begin");
button1.Text = DateTime.Now.ToString();
System.Threading.Thread.Sleep(1000);
System.Diagnostics.Debug.WriteLine("Func0 End");
}
delegate void dlgtFunc();
void ThreadOne()
{
System.Diagnostics.Debug.WriteLine("Thread One Begin");
while (m_bExitThread == false)
{
this.Invoke(new dlgtFunc(Func0));
System.Threading.Thread.Sleep(1);//删除这一行之后,看看会有什么结果
}
System.Diagnostics.Debug.WriteLine("Thread One END");
m_bThreadHasExit = true;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
m_bExitThread = true;
while (m_bThreadHasExit == false)
{
System.Diagnostics.Debug.WriteLine("Waitting");
System.Threading.Thread.Sleep(10);
}
}
private void button2_Click(object sender, EventArgs e)
{//这里开始调用线程
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadOne));
t.Start();
}
但是,实际运行会发现:很容易退不出程序
???
资源互相抢占,死锁!
这里,特殊之外就在:this.Invoke(new dlgtFunc(Func0));
看帮助可以发现,这个其实是在 主线程 中运行的.当你退出时,Closing 事件中当然也是在主线程中了.因此,这两处同一个都在同一个线程中运行,发生问题,也正常:)