Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 背景工作者问题_C#_Winforms_Multithreading_Backgroundworker - Fatal编程技术网

C# 背景工作者问题

C# 背景工作者问题,c#,winforms,multithreading,backgroundworker,C#,Winforms,Multithreading,Backgroundworker,我有一个类,当点击gui的某个部分时,它将 -创建一个backgroundworker并执行以下任务 -创建新对象(这是一个新的windows窗体) -调用获取一些数据的方法 -用该数据填充新的windows窗体gui 问题是表单上有一个gui组件,不能从主程序线程之外创建,如果我尝试,我会得到错误 活动x。。。。无法实例化,因为 当前线程不在 单线程公寓 是否有人可以提供帮助,这样我就可以组织这个 在我的do work中,不要在后台线程中创建GUI组件。使用后台线程获取和处理数据,然后在主线程

我有一个类,当点击gui的某个部分时,它将

-创建一个backgroundworker并执行以下任务

-创建新对象(这是一个新的windows窗体)

-调用获取一些数据的方法

-用该数据填充新的windows窗体gui

问题是表单上有一个gui组件,不能从主程序线程之外创建,如果我尝试,我会得到错误

活动x。。。。无法实例化,因为 当前线程不在 单线程公寓

是否有人可以提供帮助,这样我就可以组织这个


在我的do work中,不要在后台线程中创建GUI组件。使用后台线程获取和处理数据,然后在主线程的UI中呈现它们。我知道这在不方便,因为

  • 创建大量的UI元素也需要花费大量的时间和精力
  • 在UI线程中创建它们需要将代码拆分为UI部分和数据处理部分
但是没有办法解决这个问题。NET UI组件不是设计为在后台线程中处理的

要在主线程中仅执行代码的某些操作,可以使用

  • someUIControl。调用(…)
    (WinForms)或
  • Dispatcher.Invoke(…)
    (WPF)

在BackgroundWorker的
DoWork
事件处理程序中。或者,您可以在BackgroundWorker的
RunWorkerCompleted
事件处理程序中执行UI操作,该处理程序始终在UI线程中执行。

UI应仅由UI线程管理


一种可能的解决方案是使用
BackgroundWorker
异步加载数据,加载完成后,使用
dowworkeventargs
Result
属性将结果传递回UI线程,然后显示新表单。

Mb此方法可以工作。无论如何,在winforms中,您可以实现一个委托并使用Form.Invoke方法在主线程中启动它。您的应用程序是用winforms还是WPF编写的?如果有一个处理数据检索的类,然后用它来显示它,这会不会很愚蠢?然后我可以在后台工作线程中运行一个,在完成后在主线程中运行一个?如果这是可能的话,我应该考虑任何类型的继承继承权吗?@ricki:是的,将不同的任务划分为不同的类(“单一责任原则”)是有用的。在你的情况下,这是否必要很难从远处回答,因为这取决于具体的情况。我认为在您的案例中不需要任何特殊类型的继承层次结构。如果代码很简单,有两个函数(一个用于后台线程,另一个用于UI线程)就足够了;如果涉及面更广,那么开设两门课可能会有回报。