委托可以认为就是一个函数的入口.所以谁调用,占用谁的资源. 如下代码:
delegate void dlgtFunc1(int iValue);
void
Func1(
int
iValue)
{
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 );
}
{
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.最后退出时,用标志变量等待退出线程.感觉没有任何问题:)
void
Func0()
{
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 );
}
}
{
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 事件中当然也是在主线程中了.因此,这两处同一个都在同一个线程中运行,发生问题,也正常:)