Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# Windows窗体应用程序中不同线程中GUI和逻辑的分离_C#_.net_Winforms_Multithreading_User Interface - Fatal编程技术网

C# Windows窗体应用程序中不同线程中GUI和逻辑的分离

C# Windows窗体应用程序中不同线程中GUI和逻辑的分离,c#,.net,winforms,multithreading,user-interface,C#,.net,Winforms,Multithreading,User Interface,在Windows窗体应用程序中,我希望将GUI与逻辑分开。用户请求很复杂,涉及通信,因此我不希望它依赖于GUI线程。结构应类似于: GUI -----> splash screen ---------> User Form --------------> ... | # | create Manager thread | Show this Form #

在Windows窗体应用程序中,我希望将GUI与逻辑分开。用户请求很复杂,涉及通信,因此我不希望它依赖于GUI线程。结构应类似于:

GUI -----> splash screen ---------> User Form --------------> ... | # | create Manager thread | Show this Form # | Manager -----> Check user type -------> Wait for user command --> ... GUI------->启动屏幕----------------->用户表单----------------->。。。 | # |创建管理器线程|显示此表单 # | 管理器------>检查用户类型------->等待用户命令------>。。。 对于这种设计,你有哪些建议、指导方针或模式?这是正确的选择吗?谢谢大家!

编辑
Manager线程应该控制GUI,而不是相反。此外,管理器线程应该在应用程序的所有时间都有效。

传统上,这样的工作是使用

基本上,它是一个简单的类,使您能够在工作线程上执行函数,然后在该函数完成后自动调用回UI线程。在函数运行期间,用户界面将被取消阻止,可以显示进度消息,或处理其他用户输入(例如取消)

结果与您的模式类似,但每个任务都会创建和销毁一个单独的线程(实际上是池)

UI thread ---> Show splashscreen------------------->Show window------- | |return to UI | | create background worker | | -> Process user ------------ ->Perform query etc. UI线程---->显示屏幕---->显示窗口------- ||返回用户界面| |创建后台工作人员|| ->处理用户------->执行查询等。
好的,根据你的评论:

您可以使用这样的模式,这是事件处理的一个简单案例。将UI访问权授予您的管理器,以便它可以对其执行方法调用,并在任务完成时注册事件(显示了.NET中异步操作的两种主要模式)。在管理器中,您需要维护一个可以在单个线程上按顺序执行的任务列表,并确保正确调用用于将结果返回到UI的事件,以便在主UI线程上运行(基本上重新创建后台工作模式)


我不确定您希望通过这样做获得什么,是否有理由将应用程序限制为两个线程?您是否担心创建后台工作人员的成本?您需要某种查询队列系统吗?您问题中图表中的示例似乎不需要这种模式的复杂性。

传统上,这样的工作是使用

基本上,它是一个简单的类,使您能够在工作线程上执行函数,然后在该函数完成后自动调用回UI线程。在函数运行期间,用户界面将被取消阻止,可以显示进度消息,或处理其他用户输入(例如取消)

结果与您的模式类似,但每个任务都会创建和销毁一个单独的线程(实际上是池)

UI thread ---> Show splashscreen------------------->Show window------- | |return to UI | | create background worker | | -> Process user ------------ ->Perform query etc. UI线程---->显示屏幕---->显示窗口------- ||返回用户界面| |创建后台工作人员|| ->处理用户------->执行查询等。
好的,根据你的评论:

您可以使用这样的模式,这是事件处理的一个简单案例。将UI访问权授予您的管理器,以便它可以对其执行方法调用,并在任务完成时注册事件(显示了.NET中异步操作的两种主要模式)。在管理器中,您需要维护一个可以在单个线程上按顺序执行的任务列表,并确保正确调用用于将结果返回到UI的事件,以便在主UI线程上运行(基本上重新创建后台工作模式)

我不确定您希望通过这样做获得什么,是否有理由将应用程序限制为两个线程?您是否担心创建后台工作人员的成本?您需要某种查询队列系统吗?您问题中图表中的示例似乎不需要这种模式的复杂性。

您应该使用a来完成任务

它有非常方便的活动。DoWork和Runworker已完成,这将非常方便

您也可以尝试使用,它们的外观如下: (请记住,在使用线程时,如果要使用UI线程执行任何工作,必须调用(),否则将收到CrossThreadException)

操作编辑

你可以在任何你喜欢的地方创建线程,一旦它开始,你就可以让它完成几个功能。但是请记住,如果要完成UI线程只能完成的任何工作,则需要调用(),否则将出现CrossThreadException。

您应该使用来完成任务

它有非常方便的活动。DoWork和Runworker已完成,这将非常方便

您也可以尝试使用,它们的外观如下: (请记住,在使用线程时,如果要使用UI线程执行任何工作,必须调用(),否则将收到CrossThreadException)

操作编辑


你可以在任何你喜欢的地方创建线程,一旦它开始,你就可以让它完成几个功能。但请记住,如果要完成UI线程只能完成的任何工作,则需要调用(),否则将出现CrossThreadException。

我开发了一个类似的项目。GUI在不同的线程上启动管理器。 Manager有一些从GUI获取命令的方法。 GUI正在侦听经理的事件,所以