У меня есть форма Windows (C # .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, на которую я ссылаюсь.