我可以在 userControl 中使用线程来防止应用程序运行时挂起吗?

Posted

技术标签:

【中文标题】我可以在 userControl 中使用线程来防止应用程序运行时挂起吗?【英文标题】:Can I use thread in userControl to prevent hanging while application is running? 【发布时间】:2019-12-30 12:07:21 【问题描述】:

我在 C# 中设计了一个 WPFuserControl 类包含一个计算昂贵操作的方法(称为MainProgram)。为了防止应用程序运行时 UI 挂起,我决定使用线程。我想使用 基于任务的异步模式 (TAP) 以及 async-await 关键字。

这是算法的伪代码:

private void StartSearch_Click(object sender, EventArgs e)

    textBoxLog.AppendText("Program Start");
    globalSetter();
    MainProgram();  

在程序中,用户应在 UI 中填写表单(包括一些textBox),然后单击StartSearch 按钮运行MainProgram,直到textBox 中显示输出。如伪代码中所述,此时,UI 中的一条消息向用户显示程序已启动。然后globalSetter方法,设置用户从UI填写的所有全局参数。使用这些参数,MainProgram 开始运行(这是一种繁重的方法)并需要几分钟才能运行。在 MainProgram 运行时,它通过在 textBox! 中向用户显示消息来处理 UI!

那么,问题是如何在应用程序运行时使用 TAB 来防止 UI 挂起?谢谢大家的回答。

【问题讨论】:

@vasily.sib 你可以看到伪代码。请描述我如何使用 TAP 在另一个线程中运行代码?如果我的实现是错误的,请告诉如何修复它? tnx 这取决于你。我认为版主总有一天会发现这个问题,并将其标记为删除。或者也许一些新的 SO 用户会为你写一些代码来获得一些代表:\ 【参考方案1】:

您可以在 MSDN 上找到有关基于任务的异步模式 (TAP) 的更多信息。我建议阅读整个页面,任务有时会带来讨厌的错误或其他问题。使用前您应该完全了解它。

https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap

您可以在新任务中执行代码

Task.Factory.StartNew(() => 
    Console.WriteLine("Hello Task");
);

【讨论】:

我已经尝试过您的解决方案,但收到错误消息:System.InvalidOperationException:'跨线程操作无效:控件'comboBoxLanguage'从创建它的线程以外的线程访问。'它在 globalSetter 方法运行时发生。

以上是关于我可以在 userControl 中使用线程来防止应用程序运行时挂起吗?的主要内容,如果未能解决你的问题,请参考以下文章

WINFORM UserControl属性的特性

防止通知电子邮件中的 Gmail 线程对话

PyQt5使用多线程防止卡死

Tkinter:如何使用线程来防止主事件循环“冻结”

如何防止后台线程抛出的异常让程序崩溃退出

我可以编写一个 .NETCF 部分类来扩展 System.Windows.Forms.UserControl 吗?