我有一个带有statusLabel的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方法。出于某种原因,我不能让状态标签显示“过程已经开始”。它只显示“过程完成!”。正如您所看到的,我已尝试使包含状态标签但未成功的状态条无效,刷新和更新。我无法在statuslabel本身上调用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();
}
所以我猜“处理”是在UI线程上进行的,但是在自己的线程上调用了eventhandler,然后在UI线程上调用控件更新。这是一种愚蠢的做事方式吗?注意:包含DoSomeProcess()方法的类位于我引用的单独的.NET ClassLibrary中。