您的位置:首页 > 其它

调用委托后,资源占用哪个线程的?

2007-11-15 21:08 204 查看
委托可以认为就是一个函数的入口.所以谁调用,占用谁的资源. 如下代码:

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);
}


输出如下:

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);
}
}
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 事件中当然也是在主线程中了.因此,这两处同一个都在同一个线程中运行,发生问题,也正常:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: