Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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# 控件。从运行窗体的同一线程调用_C#_.net_Multithreading_Winforms - Fatal编程技术网

C# 控件。从运行窗体的同一线程调用

C# 控件。从运行窗体的同一线程调用,c#,.net,multithreading,winforms,C#,.net,Multithreading,Winforms,在C#中,使用Control.Invoke从运行窗体的同一线程更改控件的属性是否有问题 我知道最好使用Control.Property=value,但我想知道使用Control.Invoke会产生哪些后果 例如: 使用此选项: public partial class FormMain : Form { private void Button1_Click(object sender, EventArgs e) { this.Invoke(new delegate

在C#中,使用Control.Invoke从运行窗体的同一线程更改控件的属性是否有问题

我知道最好使用
Control.Property=value
,但我想知道使用Control.Invoke会产生哪些后果

例如:

使用此选项:

public partial class FormMain : Form
{
    private void Button1_Click(object sender, EventArgs e)
    {
        this.Invoke(new delegate {Label1.Text = "Hello"});
    }
}
与此相反:

public partial class FormMain : Form
{
    private void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "Hello";
    }
}


需要调用一个属性。您应该首先调用它,以了解是否需要调用。这只是调用的开销。它应该可以正常工作,但是为什么呢?根据“在控件所属的同一个线程上调用它是一个错误。”(这是在
Invoke(delegate,object[])
上,但是我们可以看到
Invoke(delegate)
只是委托给该方法)由于不知道代码在哪个线程上运行,您会损失-100个优雅点。要证明代码是线程安全的非常困难,线程代码从来都不是一个好的属性。总之,开销非常小。@Damien_the_unsiver-注释可能会这样说,但代码似乎没有强制执行它。当然,仅仅因为它在今天起作用(我试过了),并不意味着它会起作用。@Blorgbeard你不能谈论你的命令。希望能对你的问题有所帮助!!如果你对我的答案没有帮助,上传你的问题更详细。
this.Invoke(new Action(
    delegate()
    {
        label2.Text = "Test";
    }));
this.Invoke(new MethodInvoker(
    delegate()
    {
        label2.Text = "Test";
    }));