C# Window.BeginInvoke()和Control.BeginInvoke()之间有什么区别?

C# Window.BeginInvoke()和Control.BeginInvoke()之间有什么区别?,c#,.net,wpf,C#,.net,Wpf,我需要更改标签内容。但是代码在执行之前会休眠。那么,我使用窗口执行代码或使用控件本身有什么不同呢?比如: // Use Label execute Label1.BeginInvoke(new Action(()=>{ System.Thread.Thread.Sleep(5000); Label1.Content = "New Value"; }); // Use Window execute MainWindow.BeginInvoke(new A

我需要更改标签内容。但是代码在执行之前会休眠。那么,我使用窗口执行代码或使用控件本身有什么不同呢?比如:

// Use Label execute
Label1.BeginInvoke(new Action(()=>{
         System.Thread.Thread.Sleep(5000);
         Label1.Content = "New Value";
});

// Use Window execute
MainWindow.BeginInvoke(new Action(()=>{
         System.Thread.Thread.Sleep(5000);
         Label1.Content = "New Value";
});
无论我使用标签还是窗口,当线程休眠时,它总是卡在UI上。为什么?为什么在我们执行label.BeginInvoke时它不冻结标签,如果没有任何不同,为什么Microsoft不删除Control.BeginInvoke的方法

更新1: 对于Sleep5000很抱歉,我只是告诉您,在更改标签内容之前,有一个方法需要花费很多时间才能执行

更新2 因此,如果没有任何不同,那么Control2.BeginInvoke和Control3.BeginInvoke没有任何不同? 那为什么微软不只保留窗口呢

更新3 为什么我可以更改Control3.BeginInvoke中的Control2.Content?如果没有限制,为什么所有人都有这种方法?为什么

更新4
也许更新2-3是一个伪问题,很抱歉,我的意思是:如果我们可以在windows.begininvoke中更改label1.content,为什么我们仍然需要label1.begininvoke?

来自

在创建控件基础句柄的线程上异步执行指定的委托

文件

将当前线程挂起指定的时间

窗口和标签都是在同一个线程UI线程上创建的。当您使用BeginInvoke调用Thread.Sleep时,它会执行您期望的操作,并导致线程挂起此线程负责侦听windows消息并保持UI响应,这就是应用程序冻结的原因

我注意到你在一篇评论中写道


@alykins,因为这意味着有一些方法需要花费很多时间,我不会让主UI线程卡在那里

这个问题的解决方案是不在UI线程上调用Sleep。您需要将长时间运行的任务移交给单独的工作线程,而不是在UI线程上执行。考虑阅读一个方法来做这件事。

回答你的最新更新

如果我们可以在windows.begininvoke中更改label1.content,为什么我们仍然需要label1.begininvoke


在不太可能的情况下,您的标签和窗口是由单独的线程而不是UI线程创建和拥有的,您将使用Label.BeginInvoke更新标签和窗口。BeginInvoke将不起作用

你为什么要做一个线程;在调用时?你不是在调用同一个方法吗?这两个实例都是从同一个基类继承的吗?@alykins,因为这意味着有一些方法需要花费很多时间,而且我不会让主UI线程卡在那里。@qakmak-这是一种糟糕的做法。您不应该执行thread.sleep-无论如何,这会导致比您意识到的更多的问题,并且不是基线问题的解决方案。@qakmak睡眠也会挂起它-然后它仍然需要完成调用。您应该拥有您所说的完成触发事件和在UI中订阅事件所需的方法,并让触发的事件启动调用。如果您所做的只是更新它,那么您不希望在控件调用中执行挂起时间-您希望它只是更新掉发生的其他事情。不要监视控件调用中的进程。为什么一直说睡眠?我已经解释过了,可能代码会使用UI,可能代码会更改标签的其他属性,但是因为需要一些时间,所以孔窗口UI会冻结。你连我想要的答案都不给我谁说Window.BeginInvoke不行?我总是使用this.beginInvokeNewAction=>{Label1.Content=something;};这是指窗口,它工作正常。请再次阅读您的问题和我的答案。谢谢相关内容如下:您的问题:如果我们可以在windows.begininvoke中更改label1.content,为什么我们仍然需要label1.begininvoke?我的答案是:在不太可能的情况下,您的标签和窗口是由单独的线程而不是UI线程创建和拥有的,您可以使用Label.BeginInvoke来更新标签和窗口。BeginInvoke不起作用。确定。我不明白,那是什么情况?你能给我一个样品吗?