首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c# 2.0中的UI冻结问题

c# 2.0中的UI冻结问题
EN

Stack Overflow用户
提问于 2011-04-05 21:55:16
回答 4查看 178关注 0票数 2

有时,当我从窗体中调用一个方法来做一些UI冻结的事情时,我会看到这一点。如何解决这个问题?如果我在单独线程中调用该方法,那么问题会得到解决吗?

如果我像下面这样在单独的线程中调用方法

代码语言:javascript
运行
复制
new System.Threading.Thread(delegate()
{
  HeavyMethod();
}).Start();

这解决了我的问题吗?还是有更好的解决方案?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-05 21:57:34

在后台工作者上调用该方法将是最好的解决方案。http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

这样做,您可以控制更新的时间(使用报告进度功能),并允许您取消工作。

此外,请确保您在backgroundWorker1.RunWorkerAsync();中操作的任何资源都被正确共享。你可以进入所谓的“竞争条件”,这会导致你的输出是非威慑的(例如,你不会在每次运行该方法时都得到相同的结果)

有关多线程和共享资源的详细介绍,请参阅此链接:http://www.c-sharpcorner.com/uploadfile/mgold/multithreadingintro10062005000439am/multithreadingintro.aspx?articleid=920ecafc-e83b-4a9c-a64d-0b39ad885705

票数 6
EN

Stack Overflow用户

发布于 2011-04-05 21:59:40

如果要调用方法以响应事件,则默认情况下,该方法将在GUI线程(运行库用于处理所有用户事件的线程)上运行。如果该方法很大和/或很重,那么它将按照您所描述的那样“冻结”UI。

对于这些情况中的许多情况,让它在单独的线程上运行是一个可行的解决方案。

但是,在某些情况下,您实际上希望UI“阻塞”(例如,如果您正在更新大量控件,则不希望用户在此期间搞乱它们)。对于这种情况,最明智的方法是弹出一个模式“等待”对话框。

票数 2
EN

Stack Overflow用户

发布于 2011-04-05 22:01:50

因为它是C# 2.0,所以我认为它是WinForms。不要用CPU限制的代码来阻塞UI线程。

您可以派生一个新线程来运行受CPU限制的代码,但必须注意不要访问WinForms控件,尤其是不要更新控件属性。许多WinForms控件只能从UI线程访问/更新。检查InvokeRequired字段,查看是否需要将来自另一个线程的调用编组(即使用Invoke)返回到UI线程。

另外,请考虑使用ThreadPool而不是创建新线程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5553010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档