【问题标题】:Delegating code to run from main thread for handling gui from main thread委派代码从主线程运行以处理来自主线程的 gui
【发布时间】:2010-04-07 19:53:25
【问题描述】:

我有一些代码正在由后台工作人员运行来自后台工作人员的控制) 我通过类引发一个事件并从那里收听 mainForm 中的事件我检查是否需要调用并重新调用。然后调用我想在主线程中运行的实例的公共方法。我有几个问题:

  1. 从主线程处理在 backgoundworker 上下文中创建的数据成员是否有任何问题 - 用于读取和更改值

  2. 是否有针对此类问题的设计模式?理想情况下,我想运行任何委托 - 任何返回值和一些通用参数 - 作为内置委托的 func - 这是有问题的,因为这意味着如果我想支持多达 3 个带或不带返回值的参数,我将不得不有 6 个事件和 6 个侦听器实际上做同样的事情 - 有没有人知道如何正确地做到这一点? 谢谢!

【问题讨论】:

    标签: c# user-interface multithreading c#-3.0


    【解决方案1】:

    我只是为一个类似的问题写了这篇文章。

    我使用线程来处理这类事情。

    在我的代码中的某个地方:

    // Definition 
    private static Thread TH; 
    

    ....

    // When process starts
    TH = new Thread(new ThreadStart(Splash_MyCallBack)); 
    TH.Start();
    

    ....

    // This method starts the form that shows progress and other data
    static private void Splash_MyCallBack()
    {
       frmLoading FL;
    
       FL = new frmLoading();
    
       FL.ShowDialog();
    
    } /* Splash_MyCallBack*/
    
    // Your process calls Splash_Stop when it is done.
    static public void Splash_Stop()
    {
       TH.Abort();
    } /* Splash_Stop*/
    

    frmLoading 执行视觉效果,而在后台我有一个处理器密集型任务。 我的进程向界面报告其进度。 frmLoading 实现了该接口,因此它知道它并可以显示需要的任何内容(在我的情况下为 2 个进度条) 唯一要注意的是,frmLoading 必须在构造函数中有这个:

    Control.CheckForIllegalCrossThreadCalls= false;
    

    在某些情况下可能会有风险(不是我的情况)。

    我认为主进程调用一个接口来更新进度,而真正的接口消耗它是一种模式。 希望对您有所帮助,如果您愿意,我可以添加更多内容。

    问候,

    【讨论】:

      【解决方案2】:

      回答你的第一个问题:

      处理后台工作程序中创建的数据应该没有任何问题。我已经在几个应用程序中完成了它并且没有任何问题。

      【讨论】:

        猜你喜欢
        • 2012-06-22
        • 2011-01-14
        • 2021-01-05
        • 2012-04-03
        • 1970-01-01
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多