如何在 WinForms 中正确创建线程 GUI 应用程序?

发布于 2024-11-01 23:27:48 字数 423 浏览 1 评论 0原文

我来自 C 背景,目前我想制作一个小型 WinForms 实用程序,它具有响应式 GUI 和长时间运行的工作线程。

GUI 是常规的 Form1 派生内容,带有进度指示器和内容,工作线程属于 new System.Threading.Thread(); 类型。

在 C++ 中一切都很简单,在 .NET 中我不知道该怎么做。

是否有一种 PostMessage 类型的数据更新方式?我是否在主线程上启动一个读取共享锁保护结构的计时器,还有其他方法吗?看到了有关代表的多个文档,但在 10 篇不同的文章之后,它们似乎不起作用,也许是因为我有 Worker<->GUI 关系,而不是 GUI<->GUI 关系。

所有 GUI 内容都在 GUI 类中,所有工作人员内容都在其自己的工作人员类中。管理世界中的最佳实践是什么?

I'm from C background, and currently I want to make a small WinForms utility that has responsive GUI, and long running worker thread.

GUI is regular Form1 derived stuff, with progress indicators and stuff, worker thread is of kind new System.Threading.Thread();.

In C++ everything is simple, in .NET I have no clue what to do.

Is there a PostMessage kind of way for data updates? Do I kick a Timer on the main thread that reads shared lock protected structure, is there another approach? Saw multiple documents on delegates, but after 10 different articles they doesn't seem to work, maybe because I have a Worker<->GUI relation, not a GUI<->GUI relation.

All GUI stuff is in GUI class, all worker stuff is in its own worker class. What are the best practices in managed world?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

ゞ记忆︶ㄣ 2024-11-08 23:27:48

有很多方法,但很简单,

  • 启动线程
  • 使用 InvokeRequired 和 Invoke() 返回 GUI 线程

另外 BackgroundWorker 提供了一种更简单的方法。

There are many ways, but simply,

  • Launch a thread
  • Use InvokeRequired and Invoke() to get back to GUI Thread

Also BackgroundWorker provides an easier approach.

我们的影子 2024-11-08 23:27:48

这是 WinForms 应用程序中的程序类

 static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }

,这里只有一个线程 [STAThread]

您可以使用 [MTAThread] 代替它,以便可以处理

或创建 多个线程使用 System.Threading 线程化运行时

this is the program class in WinForms Application

 static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }

here there is only a single thread [STAThread]

you can use [MTAThread]instead of it so multiple threads can be handled

or can create thread a runtime using System.Threading

忆梦 2024-11-08 23:27:48
  1. 使用BackgroundWorker
  2. 使用Control.Invoke
  3. 使用SynchonizationContext
  4. 使用任务并行库(System.Threading.Tasks
  5. 使用Rx
  6. 不要使用Thread.Start 或ThreadPool
  1. Use BackgroundWorker
  2. Use Control.Invoke
  3. Use SynchonizationContext
  4. Use Task Parallel Library (System.Threading.Tasks)
  5. Use Rx
  6. DO NOT USE Thread.Start or ThreadPool
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文