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

Task.Run和UI进度更新分享

时间:2023-04-10 12:04:54 C#

Task.Run和UI进度更新此代码片段来自StephenCleary的博客,并提供了使用Task.Run时如何报告进度的示例。我想知道为什么没有更新UI的跨线程问题,我的意思是为什么不需要调用?privateasyncvoidbutton2_Click(objectsender,EventArgse){varprogressHandler=newProgress(value=>{label2.Text=value;});varprogress=progressHandler作为IProgress;awaitTask.Run(()=>{for(inti=0;i!=100;++i){if(progress!=null)progress.Report("Stage"+i);Thread.Sleep(100);}});label2.Text="完成。";Progress在实例化时捕获当前的SynchronisationContext。每当调用Report时,它都会秘密地将其委托给捕获的上下文。在示例中,捕获的上下文是UI,这意味着不会发生异常。Progress构造函数捕获当前的SynchronizationContext对象。SynchronizationContext类是一个工具,用于抽象所涉及的线程模型的细节。也就是说,在Windows窗体中它将使用Control.Invoke,在WPF中它将使用Dispatcher.Invoke等。当调用progress.Report对象时,Progress对象本身知道它应该使用捕获的SynchronizationContext运行它的委托。换句话说,它之所以有效,是因为Progress旨在处理这种情况,而无需开发人员明确说明。看起来你很困惑,因为这个跨线程机器的一部分对开发人员来说是隐藏的,所以你只需要“接受并使用”:http://blogs.msdn.com/b/dotnet/archive/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis.aspx我们引入了IProgress界面,使您能够创建显示进度的体验。该接口公开了Report(T)方法,异步任务调用该方法来报告进度。您在异步方法的签名中公开此接口,调用者必须提供一个实现此接口的对象。同时,任务和调用者创建了一个非常有用的链接(并且可以在不同的线程上运行)。我们还提供了Progress类,它是IProgress的一个实现。建议您在实现中使用Progress,因为它会处理有关保存和恢复同步上下文的所有簿记。Progress公开在任务报告进度时调用的事件和Action回调。此模式允许您编写代码以在进度发生变化时立即做出反应。IProgress和Progress一起提供了一种将进度信息从后台任务传递到UI线程的简单方法。还有一点要提一下:进度通知会在部分工作完成后调用,而不是在那一刻才调用。因此,如果您的UI线程空闲并且您有备用CPU内核,则延迟几乎为零。如果您的UI线程很忙,则在UI线程再次空闲之前不会调用通知(无论您的计算机有多少备用CPU核心)。以上就是C#学习教程的全部内容:Task.Run和UI进度更新分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: