委托异步调用提前终止
在一个控制台程序里,定义一个委托加入一个方法实例化后,用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之后,由于主线程存在,所以后台线程能正常工作