当前位置: 首页 > 编程语言 > C#

DispatcherInvoke(...)vsBeginInvoke(...)混淆分享

时间:2023-04-11 10:31:43 C#

DispatcherInvoke(...)vsBeginInvoke(...)混淆计数器应用程序使用调度程序上的“BeginInvoke”在我的2个(或更多)并发运行的反向文本框中使用Count()方法。您可以通过将BeginInvoke替换为Invoke来解决问题。但这并不能解决我的困惑。这是我正在谈论的示例代码:publicclassCounterTextBox:TextBox{privateint_number;publicvoidStart(){(newAction(Count)).BeginInvoke(null,null);}privatevoidCount(){while(true){if(_number++>10000)_number=0;this.Dispatcher.BeginInvoke(newAction(UpdateText),System.Windows.Threading.DispatcherPriority.Background,null);}}privatevoidUpdateText(){this.Text=""+_number;当您使用Dispatcher.BeginInvoke时,这意味着它会在稍后的某个时间点分派要在UI线程中执行的给定操作,然后返回控制权以允许当前线程继续执行。Invoke会阻塞调用者,直到预定的操作完成。当您使用BeginInvoke时,您的循环将运行得非常快,因为BeginInvoke会返回。这意味着您要向消息队列添加许多操作。您添加它们的速度比实际处理它们的速度快得多。这意味着在您安排消息和它实际有机会运行之间有很长的时间。您正在运行的实际操作使用字段_number。但是当操作在队列中时,另一个线程正在非常快速地修改_number。这意味着它不会在您安排操作时显示_number的值,而是在它继续其非常紧密的循环后显示的内容。如果您使用Dispatcher.Invoke,那么它会阻止循环“通过自身”并具有多个预定事件,从而确保它写入的值始终是“当前”值。此外,通过强制循环的每次迭代等待消息运行,它使循环不那么“紧”,因此它通常不会运行得很快。如果你想使用BeginInvoke,你真正需要做的第一件事就是减慢你的循环。如果您希望它每秒或每10毫秒或其他任何时间更新文本,那么您可以使用Thread.Sleep等待适当的时间。接下来,您需要将_number的副本传递给Dispatcher,以便它在您调度它时显示该值,而不是在它执行时显示:以上是C#学习教程:DispatcherInvoke(…)vsBeginInvoke(…)混淆分享,如果对你有用,需要多了解C#学习教程,希望大家多多关注——while(true){if(_number++>10000)_number=0;intcopy=_number;this.Dispatcher.BeginInvoke(newAction(()=>UpdateText(copy)),System.Windows.Threading.DispatcherPriority.Background,null);线程.睡眠(200);}privatevoidUpdateText(intnumber){this.Text=number.ToString();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢