2011-04-05 22 views
3

使用C#Windows.Forms,必须在主/ GUI线程(需要Invoke/BeginInvoke)上运行Invalidate(),Refresh()等方法吗?如何更改GUI对象的成员,如添加/删除点或更改Charting.Chart对象中的系列的颜色?何时在GUI对象上调用时需要?

我有一些工作线程中发生的这些变化没有任何问题(所以我猜他们没事吗?),但我试图区分GUI线程需要哪些更改以及哪些更改可以发生工作线程中的对象。有没有人有链接或书籍参考指导这个问题?

+0

任何使用窗口句柄 – 2011-04-05 16:16:53

+2

如果没有他们明确地告诉你一个异常,类可能是线程不安全的。 List <>类将是一个例子。只有当文档告诉你该成员是线程安全的时,才使用其实例创建的类的成员或在另一个线程上访问的成员。这很少见,Chart类肯定不是。这不是你“冒险”的东西,猜错的代价是巨大的。 – 2011-04-05 16:54:47

回答

4

在一般情况下,你通常应该承担的所有改变GUI元素应该在UI线程上进行。

通常,后台线程上的更改在测试过程中将起作用,但会中断部署后。一般来说,除非另有说明,假设所有内容都应该在UI线程上更安全。

-1

这应该告诉你Control.InvokeRequired

+0

这只是告诉你,你是否目前在UI线程,而不是一个特定的API是否需要这个。 – 2011-04-05 16:18:08

+0

这只是告诉你,如果你在错误的线程。它不会告诉你你要调用的方法是否需要在窗口句柄的线程上运行。 – 2011-04-05 16:18:56

+0

@Reed Copsey:只有当它创建了句柄 – 2011-04-05 16:21:15

1

您不能在工作线程上进行操作WinForms控件的同步方法调用。

我不确定什么“添加/删除点”指的是Charting.Chart类。这个类可以自己封装GUI线程调用。一般来说,如果您要修改控件上的大小,文本,背景颜色或其他属性,则必须使用Invoke/BeginInvoke。

相关问题