在C#WinForms应用程序中,启动后台线程的合适位置在哪里?

在C#WinForms应用程序中,启动后台线程的合适位置在哪里?,c#,winforms,multithreading,C#,Winforms,Multithreading,我想开始2个后台线程。一个线程充当客户端的服务器,另一个线程充当服务器的客户端。此应用程序既是服务器应用程序又是客户端应用程序。在调用Application.Run()之前,是否应该在Main()函数中启动这些线程?还是应该在加载主窗体后创建它们?我试图使UI和业务逻辑彼此分开,但我知道这些线程需要向表单通知事件。这方面的最佳编码实践是什么?谢谢 如果他们需要在主窗体上执行逻辑,则需要在创建主窗体的线程上运行该逻辑。因此,客户机和服务器都需要有对主窗体的引用,以便它们可以在主窗体上调用Invok

我想开始2个后台线程。一个线程充当客户端的服务器,另一个线程充当服务器的客户端。此应用程序既是服务器应用程序又是客户端应用程序。在调用Application.Run()之前,是否应该在Main()函数中启动这些线程?还是应该在加载主窗体后创建它们?我试图使UI和业务逻辑彼此分开,但我知道这些线程需要向表单通知事件。这方面的最佳编码实践是什么?谢谢

如果他们需要在主窗体上执行逻辑,则需要在创建主窗体的线程上运行该逻辑。因此,客户机和服务器都需要有对主窗体的引用,以便它们可以在主窗体上调用Invoke或BeginInvoke(取决于主窗体上的代码需要是同步的还是异步的)。因此,您可能应该在加载主窗体后启动线程,以便将对它的引用传递给客户端和服务器。

main()启动它们
在创建UI之前。

这是否意味着我需要在所有业务逻辑类中传递对主窗体的引用?仅在您可能需要调用主窗体上的代码的地方。我想另一种方法是让您的主表单由某个全局类公开,您的所有业务逻辑都有一个引用,或者一个静态类。在这种情况下,您可以在
Main()
方法中创建线程。在调用主窗体上的某些代码之前,您只需要检查以确保公开主窗体的任何属性或方法都没有返回null。此外,在调用表单上的代码之前,您应该始终检查以确保表单未被释放。我将如何设置包含主表单的全局类?这取决于应用程序的设置方式。所有内容都在同一个程序集中吗?还是有多个程序集,每个程序集都包含业务逻辑的不同部分?这将影响需要定义全局类的位置,或者是否可能。如果事情在同一个程序集中,或者您有一个所有其他人都引用的公共程序集,您可以这样做:但是我会使用单例模式,而不是完全复制代码。否则,您可能必须将表单传递给所有业务逻辑。我可以将所有线程和表单放在自定义ApplicationContext类中吗?这样合适吗?