InvokeRequired зависает
Поток пользовательского интерфейса иногда зависает в операторе if (this.InvokeRequired) в следующем методе.
Можете ли вы помочь мне определить причину проблемы
public void OnModuleInitializationCompleted(object sender, EventArgs e)
{
ModuleStatusWindow.Logger.LogMessage("OnModuleInitializationCompleted", LogMessageType.Information, "Received {0}", (sender as IModule).Name);
if (this.InvokeRequired)
{
this.BeginInvoke(new ECEventsHandler(OnModuleInitializationCompleted), sender, e);
}
else
{
CheckIfAllModulesInitComplete();
}
}
private void CheckIfAllModulesInitComplete()
{
ModuleStatusWindow.Logger.LogMessage("CheckIfAllModulesInitComplete", LogMessageType.Information, "Enter >>");
this._moduleStatusGrid.DataSource = this._moduleDataList.ToArray();
this._moduleStatusGrid.Invalidate();
ModuleStatusWindow.Logger.LogMessage("CheckIfAllModulesInitComplete", LogMessageType.Information, "Updated grid control...");
if (this._moduleDataList.Count(moduleData => !moduleData.IsInitOver) == 0)
{
this._footprint.DeActivate();
ModuleStatusWindow.Logger.LogMessage("CheckIfAllModulesInitComplete", LogMessageType.Information, "Stopping message listenr...");
ClientMessageListner.Stop();
ModuleStatusWindow.Logger.LogMessage("CheckIfAllModulesInitComplete", LogMessageType.Information, "Closing Window...");
this.Close();
}
ModuleStatusWindow.Logger.LogMessage("CheckIfAllModulesInitComplete", LogMessageType.Information, "Leave <<");
}
3 ответа
Я хотел бы добавить сообщение журнала после InvokeRequired и до вызова BeginInvoke.
Я подозреваю, что это блокировка BeginInvoke, потому что поток пользовательского интерфейса занят, возможно, потому, что он ожидает чего-то другого.
Я не думаю, что InvokeRequired может зависнуть. BeginInvoke может, но я не думаю, что это будет.
Мало идей.
BeginInvoke работает правильно, но поток пользовательского интерфейса занят, поэтому он никогда не переходит к выполнению OnModuleInitializationComplete. Что этот поток продолжает делать? Начинается ли ожидание (например, вызов EndInvoke) как какой-то момент?
InvokeRequired возвращает false, а ваш метод CheckIfAllModulesInitComplete зависает.
Я хотел бы добавить дополнительные записи в OnModuleInitializationComplete, чтобы показать, какой путь, если он принял, а затем обновить ваш вопрос с новой информацией.
Если вы также можете предоставить немного больше информации о коде этого метода, это может быть полезно, особенно в любом месте, где будет ждать завершения этого метода.
Скорее всего, у вас есть какое-то состояние гонки, что приводит к тупику. Или ваша отладочная информация испорчена, и это не та строка, которая блокирует.