我有一个快速连续调用的函数,它有一个开放的数据库连接。 我的问题是,在关闭一个数据库连接之前,会调用该函数的另一个实例,并且可能会在数据库中收到死锁。如何等待线程在C#中完成执行?
我曾尝试:
private static WaitHandle[] waitHandles = new WaitHandle[]
{
new AutoResetEvent(false)
};
protected override void Broadcast(Data data, string updatedBy)
{
Action newAction = new Action(() =>
{
DataManagerFactory.PerformWithDataManager(
dataManager =>
{
// Update status and broadcast the changes
data.UpdateModifiedColumns(dataManager, updatedBy);
BroadcastManager.Instance().PerformBroadcast(
data,
BroadcastAction.Update,
Feature.None);
},
e => m_log.Error(ServerLog.ConfigIdlingRequestHandler_UpdateFailed() + e.Message));
}
);
Thread workerThread = new Thread(new ThreadStart(newAction));
ThreadPool.QueueUserWorkItem(workerThread.Start, waitHandles[0]);
WaitHandle.WaitAll(waitHandles);
}
但是我收到一个线程错误,程序冻结。这与线程启动功能没有任何参数有关。
感谢您的任何帮助
在'QueueUserWorkItem'第二个目的是参数。请参阅[MSDN](http://msdn.microsoft.com/en-us/library/4yd16hza.aspx) – climbage
通常,您不会将'ThreadPool'上的新线程的'Start'方法排队。这种打击的目的。只需排队'newAction'。您应该锁定您身边的任何方法('PerformBroadcast'?),这可能会导致服务器端发生死锁。 –
ThreadPool.QueueUserWorkItem(newAction,null);不工作。 ThreadPool.QueueUserWorkItem(newAction,waitHandles [0]);不工作。 –