使用C#Windows.Forms,必须在主/ GUI线程(需要Invoke/BeginInvoke)上运行Invalidate(),Refresh()等方法吗?如何更改GUI对象的成员,如添加/删除点或更改Charting.Chart对象中的系列的颜色?何时在GUI对象上调用时需要?
我有一些工作线程中发生的这些变化没有任何问题(所以我猜他们没事吗?),但我试图区分GUI线程需要哪些更改以及哪些更改可以发生工作线程中的对象。有没有人有链接或书籍参考指导这个问题?
使用C#Windows.Forms,必须在主/ GUI线程(需要Invoke/BeginInvoke)上运行Invalidate(),Refresh()等方法吗?如何更改GUI对象的成员,如添加/删除点或更改Charting.Chart对象中的系列的颜色?何时在GUI对象上调用时需要?
我有一些工作线程中发生的这些变化没有任何问题(所以我猜他们没事吗?),但我试图区分GUI线程需要哪些更改以及哪些更改可以发生工作线程中的对象。有没有人有链接或书籍参考指导这个问题?
在一般情况下,你通常应该承担的所有改变GUI元素应该在UI线程上进行。
通常,后台线程上的更改在测试过程中将起作用,但会中断部署后。一般来说,除非另有说明,假设所有内容都应该在UI线程上更安全。
这应该告诉你Control.InvokeRequired
这只是告诉你,你是否目前在UI线程,而不是一个特定的API是否需要这个。 – 2011-04-05 16:18:08
这只是告诉你,如果你在错误的线程。它不会告诉你你要调用的方法是否需要在窗口句柄的线程上运行。 – 2011-04-05 16:18:56
@Reed Copsey:只有当它创建了句柄 – 2011-04-05 16:21:15
您不能在工作线程上进行操作WinForms控件的同步方法调用。
我不确定什么“添加/删除点”指的是Charting.Chart类。这个类可以自己封装GUI线程调用。一般来说,如果您要修改控件上的大小,文本,背景颜色或其他属性,则必须使用Invoke/BeginInvoke。
任何使用窗口句柄 – 2011-04-05 16:16:53
如果没有他们明确地告诉你一个异常,类可能是线程不安全的。 List <>类将是一个例子。只有当文档告诉你该成员是线程安全的时,才使用其实例创建的类的成员或在另一个线程上访问的成员。这很少见,Chart类肯定不是。这不是你“冒险”的东西,猜错的代价是巨大的。 – 2011-04-05 16:54:47