У меня есть форма Windows (C # .NET) с меткой состояния, которую я не могу обновить в середине процесса в методах обработчика событий. Мой код выглядит так ...
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, на которую я ссылаюсь.