调用委托后,资源占用哪个线程的?
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 事件中当然也是在主线程中了.因此,这两处同一个都在同一个线程中运行,发生问题,也正常:)
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 事件中当然也是在主线程中了.因此,这两处同一个都在同一个线程中运行,发生问题,也正常:)
相关文章推荐
- 调用委托后,资源占用哪个线程的? (一个例子)
- 查看Java哪个线程占用CPU资源
- 找出JAVA中占用CUP资源最多的哪个线程
- 找出cpu资源占用最多的那个线程
- 谈.Net委托与线程——创建无阻塞的异步调用
- C#中创建线程的方式,以及主线程和子线程之间的资源调用
- JAVA Runtime.addShutdownHook()方法{拿到线程句柄,在程序关闭之前调用释放资源}
- 哪个方法可以在任何时候被任何线程调用而不会产生预期的
- 关于C#调用Excel的资源占用问题
- 分析占用了大量 CPU 处理时间的是Java 进程中哪个线程
- WPF 委托刷新UI线程(System.InvalidOperationException: '调用线程无法访问此对象,因为另一个线程拥有该对象。')
- 通过IIS自带工具Iisapp.vbs查询哪个站点占用资源
- 如何找到 Java 进程中哪个线程占用了大量 CPU 处理时间
- 线程类的构造方法、静态块是被哪个线程调用的
- 谈.Net委托与线程——创建无阻塞的异步调用
- 关于C#调用Excel的资源占用问题
- 通过IIS自带工具Iisapp.vbs查询哪个站点占用资源
- currentThread()方法返回代码段正在被哪个线程调用
- 线程类的构造方法、静态块是被哪个线程调用的——郑州尚学堂
- C#多线程-不同线程之间通过事件委托封送调用方法