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

在C#中异步运行任务分享

时间:2023-04-10 14:55:04 C#

C#学习教程:在C#中异步运行任务问题是,在运行时,它会冻结UI(UI主线程)。我没有在C#中对线程和委托做那么多,这就是为什么我希望有人能帮助我,如何处理这些繁重的任务,而不冻结UI,所以用户不会认为应用程序在等待时崩溃?例如。我通过FrontController调用需要时间:_controller.testExportExcel(wrapper,saveDialog.FileName);因为它正在创建一个Excel文件。在工作时,我不希望应用程序在UI上响应。进程繁重任务的另一个示例可能如下所示:。克隆();red.BackColor=Color.LightGreen;如果(r.Cells["News"].Value!=null&&(bool)r.Cells["News"].Value==true)r.DefaultCellStyle=红色;}}}foreach循环需要时间,并冻结UI。运行进程并在完成时自动关闭的异步线程可能对我有用。但是它是如何工作的呢?如何使用任务(如果针对.net4)?这被认为是BackgroundWorker类的替代品,因为它支持嵌套(父/子任务)、任务延续等。例如privatevoiddataGridView_liste_DataBindingComplete(objectsender,DataGridViewBindingCompleteEventArgse){Taskt=Task.Factory.StartNew(()=>{//在这里进行处理-如果调用UI对象,请记住调用Invoke或BeginInvoke。});t.ContinueWith((Success)=>{//任务完成时回调。},TaskContinuationOptions.NotOnFaulted);t.ContinueWith((Fail)=>{//记录异常即:Fail.Exception.InnerException);,TaskContinuationOptions.OnlyOnFaulted);我在这里回答了一个非常相似的问题,归结为使用BackgroundWorker。msdn提供了一个例子:usingSystem.ComponentModel;使用System.Windows;使用System.Windows.Controls;namespaceSL_BackgroundWorker_CS{publicpartialclassPage:UserControl{privateBackgroundWorkerbw=newBackgroundWorker();publicPage(){InitializeComponent();bw.WorkerReportsProgress=true;bw.WorkerSupportsCancellation=true;bw.DoWork+=newDoWorkEventHandler(bw_DoWork);bw.ProgressChanged+=newProgressChangedEventHandler(bw_ProgressChanged);bw.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(bw_RunWorkerCompleted);}privatevoidbuttonStart_Click(objectsender,RoutedEventArgse){if(bw.IsBusy!=true){bw.RunWorkerAsync();}}privatevoidbuttonCancel_Click(objectsender,RoutedEventArgse){if(bw.WorkerSupportsCancellation==true){bw.CancelAsync();}}privatevoidbw_DoWork(objectsender,DoWorkEventArgse){BackgroundWorkerworker=senderasBackgroundWorker;for(inti=1;(i在DoWork事件处理程序中运行的所有内容都是错误的步骤在ProgessChanged/RunWorkCompleted的事件处理程序中运行的所有内容都在UI线程上运行。对于您的第一个示例,调用_controller.testExportExcel()、BackgroundWorker或任务并行库调用(即Task.Factory.StartNew(...))将满足您保持UI响应的要求。出现了大量示例,包括来自其他答案的示例。对于你的第二个例子,你会发现你不能把它放在后台线程上,因为它似乎是代码操纵UI。具体来说,如果您的BackgroundWorker的DoWork事件处理程序的实现,或传递给Task.Factory.StartNew()的委托,或普通旧线程的方法触及UI,您很可能(/确定?)得到一个异常,描述“跨线程操作无效”。这个问题涵盖了为什么。但我更惊讶的是,实际上这很慢,你想让它异步。可能有一些简单的方法可以使此代码更具响应性-.ResumeLayout()Control.SuspendLayout()和.ResumeLayout()。以上就是C#学习教程:C#异步运行任务分享的全部内容。如果对您有用,需要进一步了解C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: