Thread.Sleep vs. Thread.CurrentThread.Join


1  一个简单的程序,用了 IAsyncResult 去实现异步操作。 MyWork() 内部通过delegate 调用了非托管的com 组件,但是,当这个程序在[STAThread] 状态下运行时,delegate 死活没有执行,程序进入死循环。

 

        public void Test1()

        {

            MyWork work = new MyWork();

            IAsyncResult ar = work.BeginWork();  //begin the async action

            while (!ar.IsCompleted)  //<--- this loop will run forever in an WinForm app.

            {

                //show progress

                Thread.Sleep(50);

            }

            if (ar.IsCompleted)

            {

                work.EndWork(); // get the result.

            }

        }

 

搞了半天,高手指点把Thread.Sleep() 换成 Thread.CurrentThread.Join(50) 就可以了!

虽然MSDN 对两个方法的解释是一样的:

Thread.Join 

Blocks the calling thread until a thread terminates or the specified time elapses.
 
Thread.Sleep
Blocks the current thread for the specified number of milliseconds.
 

但是它们有细微而重要的区别,根据这个BLOG :

Thread.Sleep is a little unusual.  We can take control of threads that are inside this service.  But, following the tradition of Sleep on the underlying Windows operating system, we perform no pumping.

If you need to Sleep on an STA thread, but you want to perform the standard COM and SendMessage pumping, consider Thread.CurrentThread.Join(timeout) as a replacement.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值