我有一个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方法,因为这些方法不可用。我做错了什么?
附加信息:
"process"是通过表单上的按钮点击来启动的,该按钮调用一个独立类中的方法,该方法如下:
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[] { });
}
}
最后,我已经在updateStatusLabel
方法中添加了Application.DoEvents()
,但是并没有起到帮助作用。这是我的更新方法。
private void updateStatusLabel(string text)
{
StatusLabel1.Text = text;
statusStrip1.Refresh();
Application.DoEvents();
}
所以,我猜测“处理”是在UI线程上进行的,但事件处理程序在它自己的线程上调用,然后将控件更新调回到UI线程上。这种做法很愚蠢吗?注意:包含DoSomeProcess()方法的类位于我正在引用的单独的.NET类库中。