上升事件的外部线程更新控件

时间:2015-04-01 07:45:48

标签: c# multithreading winforms event-listener begininvoke

以下是上下文:在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 ...
        }
    }
  

结果(状态来自被解雇的事件):

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

1 个答案:

答案 0 :(得分:1)

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

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

例如使用Task

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

请注意,调用Task内的用户界面也需要InvokeBeginInvoke