У меня есть форма Windows (С#.NET) с statusLabel, которую я, похоже, не могу обновить в середине процесса в методах обработчика событий. Мой код выглядит так...
void Process_Completed(object sender, EventArgs e)
{
string t = "Process is finished!";
this.Invoke(new StatusLabelUpdator(updateStatusLabel), new object[] { t });
}
void Process_Started(object sender, EventArgs e)
{
string t = "Process has begun";
this.Invoke(new StatusLabelUpdator(updateStatusLabel), new object[] { t });
}
private delegate void StatusLabelUpdator(string text);
private void updateStatusLabel(string text)
{
StatusLabel1.Text = text;
statusStrip1.Invalidate();
statusStrip1.Refresh();
statusStrip1.Update();
}
Когда я запускаю код, как только процесс запускается, запускается метод Process_Started, а через пару секунд запускается метод Process_Completed. По какой-то причине я не могу заставить ярлык статуса отображаться "Процесс начался". Он только когда-либо показывает: "Процесс закончен!". Как вы можете видеть, я попытался сделать недействительным, обновив и обновив полосу статуса, которая содержит метку состояния, но не имеет успеха. Я не могу вызывать update/refresh/invalidate на самой статусной метке, потому что эти методы недоступны для нее. Что я делаю неправильно?
ДОБАВЛЕННАЯ ИНФОРМАЦИЯ:
"Процесс" запускается нажатием кнопки на форме, которая вызывает метод в отдельном классе, который выглядит следующим образом:
public void DoSomeProcess()
{
TriggerProcessStarted();
System.Threading.Thread.Sleep(2000); // For testing..
TriggerProcessComplete();
}
и внутри методов TriggerProcessxxxx я запускаю события, используя этот код...
var EventListeners = EH.GetInvocationList(); //EH is the appropriate EventHandler
if (EventListeners != null)
{
for (int index = 0; index < EventListeners.Count(); index++)
{
var methodToInvoke = (EventHandler)EventListeners[index];
methodToInvoke.BeginInvoke(this, EventArgs.Empty, EndAsyncEvent, new object[] { });
}
}
Наконец, я добавил Application.DoEvents()
в метод updateStatusLabel
, но это не помогло. Я все равно получаю тот же результат. Вот мой метод обновления.
private void updateStatusLabel(string text)
{
StatusLabel1.Text = text;
statusStrip1.Refresh();
Application.DoEvents();
}
Итак, я думаю, что "обработка" происходит в потоке пользовательского интерфейса, но обработчик событий вызывается в его собственном потоке, который затем вызывает обновление управления обратно в потоке пользовательского интерфейса. Это глупый способ делать вещи? Примечание. Класс, содержащий метод DoSomeProcess(), находится в отдельной библиотеке .NET ClassLibrary, на которую я ссылаюсь.