В настоящее время я пытаюсь исправить проблему инициализации, которая проистекает из предположения, что все подкомпоненты инициализируются синхронно.Могу ли я сделать асинхронные компоненты синхронными?
UI создает экземпляр класса, имеющего собственный интерфейс. Это выглядит примерно так:
ConfWizard cf = new ConfWizard();
cf.ShowDialog();
Беда в том, что класс ConfWizard использует другой класс, который инициализирует асинхронно, но должен быть готов до ShowDialog вызывается для правильного функционирования. Код ConfWizard выглядит примерно так:
public ConfWizard()
{
helper = new HelperClass
helper.ReadyEvent += new HelperClass.ReadyEventHandler(this.helper_ReadyEvent)
helper.StartUp();
// Do more initialization using properties of hc
}
private helper_ReadyEvent()
{
//HelperClass is ready to use
}
Поскольку свойства помощника не может быть установлен только перед повышением ReadyEvent, текущий конструктор вообще не инициализируется правильно. Может показаться очевидным положить оставшуюся инициализацию в helper_ReadyEvent, но это приведет к возврату конструктора до того, как объект будет готов к использованию. Поскольку классы, использующие объект ConfWizard, предполагают, что после того, как конструктор вернет объект, он полностью готов к использованию, преждевременное возвращение нежелательно.
К сожалению, я не могу изменить HelperClass, поэтому мне нужно скрыть его асинхронное поведение, чтобы класс ConfWizard можно было использовать синхронно.
Я попытался использовать объект ManualResetEvent (вызов Set в обработчике событий), но вызовы WaitOne блокируются и, таким образом, событие не обрабатывается приложением приложения.
Любые идеи о том, как достичь этого в .NET1.1?
ОБНОВЛЕНИЕ - 21 августа 2009 г.
У меня было время экспериментировать сегодня и вот что я нашел.
WaitOne - если заданный достаточно большой тайм-аут будет работать каждый раз, просто задерживая приложение. К сожалению, этот тайм-аут должен быть не менее 5 секунд (дольше, чем я должен ждать). Без тайм-аута он все еще зависает. Событие, которое вызывает набор, просто никогда не происходит.
Спящий - то же, что и WaitOne, в котором с достаточно длинным таймаутом он будет работать.
Threading - Я не хочу, чтобы пользовательский интерфейс продолжался до тех пор, пока инициализация не будет выполнена, потому что поведение пользовательского интерфейса изменяется по результатам инициализации. Однако разделение инициализации объекта HelperClass на отдельный поток и вызов Thread.Join для приостановки работы основного потока.
Таким образом, решение проблемы, кажется, использует несколько потоков в правильном порядке.
Какой? Это либо не имеет смысла, либо мой мозг полностью обжарен сегодня .... –