何时需要在GUI对象上调用invoke?

3
使用C# Windows.Forms,Invalidate()、Refresh()等方法是否必须在主/GUI线程上运行(需要Invoke/BeginInvoke)?那么对于GUI对象的成员进行更改,例如在Charting.Chart对象中添加/删除Points或更改Series的Color呢?
我在工作线程中执行了其中一些更改而没有任何问题(所以我猜它们是可以的?),但我正在尝试区分哪些更改明确要求在GUI线程上进行,哪些更改可以在工作线程中对对象进行。是否有任何链接或书籍参考可以指导这个问题?

任何使用窗口句柄的内容 - David Heffernan
2
类可能是线程不安全的,即使它们没有通过异常明确告知你。List<>类就是一个例子。当文档告诉你成员是线程安全的时候,只有使用创建实例或在其他线程上访问成员的类的成员。这是相当罕见的,Chart类肯定不是。这不是什么你可以“冒险”的事情,猜错的代价是巨大的。 - Hans Passant
3个回答

4

一般来说,您应该假设所有GUI元素的更改都应在UI线程上进行。

通常情况下,在后台线程上进行的更改在测试期间可能有效,但是在部署后可能会出现问题。 一般而言,除非另有说明,否则最安全的做法是将所有更改都放在UI线程上。


1

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

我不确定"添加/删除点"是指什么,或者Charting.Chart类是什么。这个类可能会自己封装GUI线程调用。

一般来说,如果您要修改控件的大小、文本、背景颜色或其他属性,则必须使用Invoke / BeginInvoke。


-1

这只是告诉你当前是否在UI线程上,而不是特定API是否需要它。 - Reed Copsey
这只是告诉你是否在错误的线程上。它并不告诉你即将调用的方法是否需要在窗口句柄的线程上运行。 - David Heffernan
@Reed Copsey:只有在句柄创建后才会执行此操作。 - František Žiačik
答案是肯定的,但它仍然没有回答OP的问题。这与特定方法或属性是否需要此无关。 - Reed Copsey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接