日期:2014-05-18  浏览次数:20759 次

如何有效率的实现线程阻塞
小弟要在c#中使用一个第三方的win32 dll中的回调方法获得数据,由于回调方法会在其被注册的线程中触发,考虑了两种方案,第一种方案在主线程中实现,问题是主线程可能还要做其它的事情,第二种实现可以把处理dll回调的这部分独立开来,问题是如何在Run()方法中实现线程阻塞以防止其退出呢?请各位兄弟指点指点

1. 在主线程中注册这些回调方法,并且用Console.Readline()等命令防止线程退出,以使得回调方法能够被触发
class A
{
  public static void Main(string[] args)
  {
  XXHandler xx = new XXHandler(A.Callback);//callbackID是第三方dll中定义的事件id, XXHandler 则是与某个回调方法签名一致的委托
  Register(3rdParty.callbackID, xx)
  Console.ReadLine();
  } 

  static void Callback(ref structA a)
  {}
}

2. 在另外一个类B中开启一个线程,并在其构造函数中注册回调方法,这样回调事件在这个线程中处理,但是问题是这个线程的线程函数该如何定义以防止其退出呢,不知道在Run里面的while循环里面该放些什么东西,什么都不放好像太愚蠢了, ps:这个回调会被高频率的触发
class A
{
  public static void Main(string args[])
  {
  B b = new B();
Console.Readline();
  }
}


class B
{
  XXHandler xx;
  public B()
  {
  xx = new XXHandler(this.Callback);
  Register(callbackID, xx)

  Thread t = new Thread(new ThreadStart(this.Run));
  t.SetApartmentState(ApartmentState.STA);
  t.Start();
  } 

  void Run()
  {
  while(true)
  {
  //不知道在这里做什么?!
  }
  }

  void Callback(ref structA a)
  {
  }
}

------解决方案--------------------
不会。因为你的主线程只是防止程序退出而已。