Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Winforms跨线程操作有时有效。有人能解释一下吗?_C#_Multithreading_Winforms - Fatal编程技术网

C# Winforms跨线程操作有时有效。有人能解释一下吗?

C# Winforms跨线程操作有时有效。有人能解释一下吗?,c#,multithreading,winforms,C#,Multithreading,Winforms,在winforms应用程序中,跨线程操作无效。据我所知,我们无法使用任何其他线程修改UI线程中创建的控件。我们应该使用Control.Invoke方法委托任何此类修改 我注意到一种不同的行为。我们可以修改其他线程的一些属性,但不能全部修改。查看下面的最小代码 new Thread(() => { pictureBox1.Image = new Bitmap("path-to-file"); // Works fine. Replaces the old picture with t

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

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

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();
我看到了这一点,这解释了当控件不在视图中时可能会发生这种情况。但在我的例子中,控件总是可见的


有人能解释一下这种行为背后的原因吗?

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


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

出于好奇,它每次都抛出相同的异常吗?您引用的句子是正确的。但该帖子还说,当控制装置不可见时,它不会爆炸。在我的例子中,控件总是可见的。还有什么可能的解释吗?@BharatGupta的人都很懒,编写
Image
类的人没有花额外的时间对每个可能的属性进行交叉线程检查调用。因此,在
Image
中定义的新属性可能不会警告您,但它从
Control
继承的属性将警告您。这个警告很方便,只是因为没有人对你大喊大叫说你做错了并不一定意味着你做对了,只是意味着现在没有人想大喊大叫。你的回答很有道理。是的。。。我喜欢你的回答:)