[C# - WinForms - .NET 2.0+]
I recently had a to create a database query queue system in an very complicated exisiting application. I wanted to make something quickly that would not break the exisitng modules that relied on the old method until I could go through each individual function that required change. The old way was to run a query and return a DataSet object. The new way queued each request and returned the DataSet via a delegate. This required that the original method create a query object, use an inline delegate and then wait until the delegate fired before it could continue. Basically I wanted to make an asynchronous operation synchronous. Welcome the EventWaitHandle object.
The code below is a snippet of the actual method I used. It adds an item to the queue and use the WaitOne() method of the EventWaitHandler object to wait for a signal which is fired as soon as the delegate is called.
I recently had a to create a database query queue system in an very complicated exisiting application. I wanted to make something quickly that would not break the exisitng modules that relied on the old method until I could go through each individual function that required change. The old way was to run a query and return a DataSet object. The new way queued each request and returned the DataSet via a delegate. This required that the original method create a query object, use an inline delegate and then wait until the delegate fired before it could continue. Basically I wanted to make an asynchronous operation synchronous. Welcome the EventWaitHandle object.
The code below is a snippet of the actual method I used. It adds an item to the queue and use the WaitOne() method of the EventWaitHandler object to wait for a signal which is fired as soon as the delegate is called.
public DataSet RunDSQuery(string query) { EventWaitHandle signal = new EventWaitHandle(false, EventResetMode.ManualReset); DataSet ds = null; DatabaseQueueItem queueItem = new DatabaseQueueItem(); queueItem.Command = this.DbConnection.CreateCommand(); queueItem.Command.CommandText = query; queueItem.Result_Callback = delegate(object sender, DataSet cbds, Exception cbex) { ds = cbds; signal.Set(); }; _DatabaseQueue.Add(queueItem); signal.WaitOne(); return ds; }