【问题标题】:Delegating code to run from main thread for handling gui from main thread委派代码从主线程运行以处理来自主线程的 gui
【发布时间】:2010-04-07 19:53:25
【问题描述】:
我有一些代码正在由后台工作人员运行来自后台工作人员的控制)
我通过类引发一个事件并从那里收听 mainForm 中的事件我检查是否需要调用并重新调用。然后调用我想在主线程中运行的实例的公共方法。我有几个问题:
从主线程处理在 backgoundworker 上下文中创建的数据成员是否有任何问题 - 用于读取和更改值
是否有针对此类问题的设计模式?理想情况下,我想运行任何委托 - 任何返回值和一些通用参数 - 作为内置委托的 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】:
回答你的第一个问题:
处理后台工作程序中创建的数据应该没有任何问题。我已经在几个应用程序中完成了它并且没有任何问题。