日期:2014-05-20  浏览次数:21048 次

委托异步调用提前终止
在一个控制台程序里,定义一个委托加入一个方法实例化后,用BeginInvoke进行异步调用,同时增加一个回调方法,回调方法里面用EndInvoke结束异步调用,如下面代码所示。但是执行的时候,程序一闪就完了,加入委托的方法根本不执行。为了能让控制台程序不至于一闪就执行完,我在程序的最后加入readkey,使主程序停在那里,一段时间后检查,增加到委托里面的方法执行了。这个问题很奇怪,难道是需要设置组线程为前台线程,怎么管理主线程与工作线程之间的关系呢? 委托的BeginInvoke 应该是工作线程执行委托里面的方法吧。
(注:增加到委托里面的方法有两个线程,分别向不同的数据库更新数据)

private delegate void DelegateDispatchMsg(string DataGroup, string ReferenceId, List<MsgInfo> Msgs, int NumberOfMessages);
DelegateDispatchMsg delegateDispatchMsg = new DelegateDispatchMsg(DispatchMsg);
delegateDispatchMsg.BeginInvoke(DataGroup, ReferenceId, Msgs, NumberOfMessages, new AsyncCallback(CallBackMethod), list);
Console.ReadKey();//为增加主线程的执行时间


  private void CallBackMethod(IAsyncResult ar)
  {
  ArrayList list = (ArrayList)ar.AsyncState;
  string DataGroup = (string)list[0];
  string ReferenceId = (string)list[1];
  List<MsgInfo> Msgs = (List<MsgInfo>)list[2];
  int NumberOfMessages = (int)list[3];
  DateTime start = (DateTime)list[4];
  DelegateDispatchMsg delegateDispatchMsg = (DelegateDispatchMsg)list[5];

  delegateDispatchMsg.EndInvoke(ar);

  if (_IsSuccessful)
  Log.DBLog(ReferenceId, DataGroup, NumberOfMessages, start, DateTime.Now, "S");
  else
  Log.DBLog(ReferenceId, DataGroup, NumberOfMessages, start, DateTime.Now, "F");
  }

------解决方案--------------------
这个问题很奇怪,难道是需要设置组线程为前台线程,怎么管理主线程与工作线程之间的关系呢?

 >>>>>>>>>

我就不知道这里有啥奇怪的

你不是已经知道了吗?
BeginInvoke方法会在线程池里开一个线程来执行,而线程池的线程是后台线程,无法维持进程,所以当主线程结束的时候,后台线程也被迫终止了,当你加了ReadKey之后,由于主线程存在,所以后台线程能正常工作