gpt4 book ai didi

c# - Winforms跨线程操作有时有效。有人可以解释吗?

转载 作者:太空狗 更新时间:2023-10-30 01:01:42 26 4
gpt4 key购买 nike

在 winforms 应用程序中跨线程操作无效。据我所知,我们不能使用任何其他线程修改在 UI 线程中创建的控件。我们应该使用 Control.Invoke 方法委托(delegate)任何此类修改。

我注意到一个不同的行为。我们可以修改其他线程的一些属性,但不是全部。查看下面的最小代码。

new Thread(() =>
{
pictureBox1.Image = new Bitmap("path-to-file"); // Works fine. Replaces the old picture with the new one.
}).Start();

new Thread(() =>
{
pictureBox1.Size = new Size(100, 100); // Throws error
}).Start();

new Thread(() => {
label1.BackColor = Color.Red; // Works fine. Changes the background color.
}).Start();

new Thread(() => {
label1.Text = "SomeText"; // Throws error
}).Start();

我看到了this post这解释了当控件不在 View 中时可能会发生这种情况。但在我的例子中,控件始终可见。

有人可以解释这种行为背后的原因吗?

最佳答案

您链接到的答案的第一句话仍然适用于您“您的代码从根本上是错误的,但这并不意味着您一定会被提醒。”

API 的制造者 (Microsoft) 告诉您,您永远不应该在不在 UI 线程上的情况下在控件上调用任何东西。当您不遵循他们的指示时,他们没有责任警告您。是的,它现在不会抛出异常,但这并不意味着它以后永远不会抛出异常或给您带来意想不到的行为。

关于c# - Winforms跨线程操作有时有效。有人可以解释吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37489649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com