以下是上下文:在Winform中,我使用导入库中的对象,然后启动其main方法。这个对象在事件发生时上升事件以给出进程法规(我使用我的winform方法之一订阅以获得此statuts)。 main方法返回一个bool,只有当它结束了它的进程时(所以事件上升才能知道进程的演变)
问题在于:我订阅该事件的方法很好,它将法规写入控制台并将其添加到列表框中(使用BeginInvoke) 写入控制台的信息在每次事件发生时都会被放置(正是我需要的),但是列表框显示为空白,直到main方法返回其值,然后最终显示其内容。
我希望列表框(或任何控件)显示事件在收到事件时返回的状态,否则我无法在此过程中通知我的用户。
这是我的代码,你能帮助我吗?
来自库的对象提升的本地方法:
private void ClientOnUpdate(object sender, EventParameters UpdateEventArgs)
{
//Instant write
Console.WriteLine("Update Event Parameters: {0}", UpdateEventArgs);
//Wait for the return of the Start method to show results inf lisbox
lbErrors.BeginInvoke((Action)delegate()
{
lbErrors.Items.Add(String.Format("Update Event Parameters: {0}", UpdateEventArgs));
});
}
从库中启动对象的主要方法:
private void Launch()
{
lbErrors.Items.Clear();
Client cl1 = new Client();
bool res = cl1.Start();
if (res == true)
{
//do stuff ...
}
else
{
//do stuff ...
}
}
结果(状态来自被解雇的事件):
答案 0 :(得分:1)
在执行Launch
后看到列表项的原因是您的private void Launch()
运行同步并阻止UI线程。当UI线程准备好执行您的方法时,列表框会更新。
您可以使用BackgroundWorker
或Task
来运行Launch
方法。这将释放UI线程。如果可能,您也可以制作Launch
方法async
。
例如使用Task
:
Task.Run(() => Launch());
请注意,调用Task
内的用户界面也需要Invoke
或BeginInvoke
。