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

委托可以认为就是一个函数的入口.所以谁调用,占用谁的资源. 如下代码:

        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 事件中当然也是在主线程中了.因此,这两处同一个都在同一个线程中运行,发生问题,也正常:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值