.NET:延迟后在UI线程上执行lambda的最佳方式?我遇到了一种情况,我需要在延迟后在UI线程上运行lambda表达式。想了好几种办法,最后确定了这个方法Task.Factory.StartNew(()=>Thread.Sleep(1000)).ContinueWith((t)=>textBlock.Text="Done",TaskScheduler.FromCurrentSynchronizationContext());但是我想知道是否有更容易错过的方法。对更短、更简单或更简单的技术有什么建议吗?假设.NET4可用。我认为你拥有的是非常好的斯科特。我认为有些人可能遇到的唯一小问题是您阻塞线程以执行延迟。当然,它是一个后台线程,除非您同时执行大量这些调用(每个都绑定到一个线程),否则不太可能导致问题,但它仍然可能不是最佳选择。我建议您将算法分解为实用方法并避免使用Thread.Sleep。显然,可以有无数种方法来做到这一点,但这里有一个:SynchronizationContextcontext=SynchronizationContext.Current;timer=newSystem.Threading.Timer((ignore)=>{timer.Dispose();context.Post(ignore2=>action(),null);},null,delay,TimeSpan.FromMilliseconds(-1));使用:UICallbackTimer.DelayExecution(TimeSpan.FromSeconds(1),()=>textBlock.Text="Done");当然,您也可以编写使用其他类型计时器(例如WPFDispatcherTimer或WinFormsTimer类)的此DelayExecution方法的实现。我不确定这些不同计时器的权衡。我的猜测是DispatcherTimer和WinForm的计时器实际上仍然适用于相反类型的应用程序。编辑:重新阅读我的回答,我想我实际上很想将它合并到一个在同步上下文上工作的扩展方法中——如果你考虑一下,更一般地说,你需要能够在延迟上下文。SynchronizationContext已经有一个用于排队工作的post方法,原始调用者不想在完成时阻塞。我们需要的是Post在延迟后工作的版本,因此改为:publicstaticclassSyncContextExtensions{publicstaticvoidPost(thisSynchronizationContextcontext,TimeSpandelay,Actionaction){timer=newSystem.Threading.Timer((ignore)=>{timer.Dispose();context.Post(ignore2=>action(),null);},null,delay,TimeSpan.FromMilliseconds(-1));}}并使用:SynchronizationContext.Current.Post(TimeSpan.FromSeconds(1),()=>textBlock.Text="Done");我认为最简单的方法是使用System.Windows.Forms.Timer,如果lambda不是一些随机函数。这个._timer.Interval=1000;this._timer.Tick+=(s,e)=>this.textBlock.Text="完成";如果labda不需要循环执行,请加上;this.timer1.Tick+=(s,e)=>this.timer1.Stop();并调用this.timer1.Start();它需要在哪里。另一种方法是使用Invoke方法。委托voidFooHandler();privatevoidbutton1_Click(objectsender,EventArgse){FooHandlerhandle=()=>Thread.睡眠(1000);处理。BeginInvoke(result=>{((FooHandler)((AsyncResult)result).AsyncDelegate).EndInvoke(result);this.textBox1.Invoke((FooHandler)(()=>this.textBox1.Text="Done"));},无效的);}Control.Invoke保证委托将在UI线程上执行(父窗口主描述符所在的位置)也许存在更好的变体。以上是C#学习教程:.NET:bestwaytoexecutelambdaonUIthreadafterdelay?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
