我可以在 userControl 中使用线程来防止应用程序运行时挂起吗?
Posted
技术标签:
【中文标题】我可以在 userControl 中使用线程来防止应用程序运行时挂起吗?【英文标题】:Can I use thread in userControl to prevent hanging while application is running? 【发布时间】:2019-12-30 12:07:21 【问题描述】:我在 C# 中设计了一个 WPF。 userControl
类包含一个计算昂贵操作的方法(称为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 中使用线程来防止应用程序运行时挂起吗?的主要内容,如果未能解决你的问题,请参考以下文章