Я использую API, который изначально был написан с помощью собственного кода и завершен с помощью .net-операций. API работает asynchronic, когда каждая операция вызывает событие, когда оно завершено. Вся моя логика синхронизирована, поэтому я хочу синхронизировать операции. Я делаю это с EventWaitHandle. вот кодСинхронизация событий, основанных на одном объекте com
Stock stock;
private System.Threading.EventWaitHandle _signal = null;
public void Sync()
{
_signal = new System.Threading.EventWaitHandle(false,
System.Threading.EventResetMode.AutoReset);
MBTradingProvider.Instance.FinnishGetStoch += new
EventHandler(Instance_FinnishGetStoch);
MBTradingProvider.Instance.GetStockAsync("IBM");
_signal.WaitOne();
}
void Instance_FinnishGetStoch(object sender, EventArgs e)
{
stock = MBTradingProvider.Instance.CurrentWorkongStock;
if (_signal != null)
_signal.Set();
}
Этот код застрял в строке _signal.WaitOne(), текущий поток замерзает и ничего не будет случилось. Я работал с одним и тем же шаблоном на другой асинхронной операции, и я отлично работаю. Единственное отличие, о котором я могу думать, это то, что под капотом работают объекты com, поскольку я сказал, что эффект, который я получаю, состоит в том, что код не отвечает после строки WaitOne
У кого-нибудь есть идея, что может быть неправильным?
Привет, я не получил решение. Насколько я понимаю, проблема может заключаться в том, что не все потоки видят мой EventWaitHandle (_signal). Я не понимаю, как этот код, использование локального «temp» EventWaitHandle, решает его? Можете ли вы объяснить это решение более подробно? Как я уже говорил, я использовал тот же код при вызове другой операции async, и он работает нормально. Может быть, есть разница в асинхронной структуре, которая используется в этих двух случаях? Спасибо. – 2009-07-11 22:39:08