2015-04-01 66 views
2

这里是上下文:在Winform中,我使用导入库中的对象,然后启动其主要方法。这个对象将事件升级,以便在处理过程中给出过程法则(我使用我的winform方法中的一种来订阅这个法度)。主要方法返回一个布尔,只有当它结束了它的过程(所以事件上升允许知道进程的演变)更新从外部线程升级事件的控件

这是问题:我的方法订阅事件是提高了,它写入控制台的statut和它添加在列表框中的statut(使用BeginInvoke) 写入控制台的信息每当事件升级时(正是我所需要的),但是列表框显示空白,直到主方法返回其价值,然后终于显示其内容

我希望列表框(或任何控件)显示在收到事件时从事件返回的状态,否则我无法在此过程中通知用户。

这是我的代码,你能帮我吗?

从文库由对象惜售本地方法:

 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 ... 
     } 
    } 

结果(身份来自被解雇的事件):

  1. 开始
  2. 第1步确定
  3. 步骤2 OK
  4. 第3步OK
  5. 结束

回答

1

,你看到执行Launch后的列表项出现的原因是您的private void Launch()运行同步并阻止UI线程。当UI线程准备好执行你的方法时,列表框会被更新。

您可以使用BackgroundWorkerTask来运行您的Launch方法。这将释放UI线程。如果可能,您也可以使用Launch方法async

例如使用Task

Task.Run(() => Launch()); 

注意,调用UI内部的Task需要InvokeBeginInvoke过。