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

获取我想要等待的方法无法等待voidshare

时间:2023-04-10 15:52:37 C#

获取我想要等待的方法无法等待无效我正在为团队编写一个WPF应用程序。我们必须这样做,以便当用户隐藏/显示不同的列时,它会反映在其中一个视图的ReportViewer控件中。在测试中,我们发现向ReportViewer的数据源添加数据需要很长时间;有时大约几秒到一分钟。作为一个用户,我想了太久。所以我正在尝试使用C#的异步和等待。但是,当我将await应用于进程猪然后对其进行编译时,我从C#编译器中收到错误消息“无法等待‘void’”。在这种情况下,我无法更改.NET框架返回的内容,它是空白的。那我应该如何处理这种情况呢?这是代码:privateasyncTaskGenerateReportAsync(){DataSetds=newDataSet();DataTabledt=newDataTable();dt.Clear();intiCols=0;//获取列名if(Columns.Count==0)//确保它没有填充两次{foreach(DataGridColumncolindataGrid.Columns){if(col.Visibility==Visibility.Visible){Columns.添加(col.Header.ToString());//获取列标题iCols++;}}}//从行中创建一个DataTablevaritemsSource=dataGrid.ItemsSourceasIEnumerable;if(this.rptViewer!=null){rptViewer.Reset();}rptViewer.LocalReport.DataSources.Clear();如果(m_rdl!=null){m_rdl.Dispose();}列=GetFieldOrder();m_rdl=CoreUtils.GenerateRdl(列,列);rptViewer.LocalReport.LoadReportDefinition(m_rdl);//下一行是需要很长时间的awaitrptViewer.LocalReport.DataSources.Add(newReportDataSource("MyData",CoreUtils.ToDataTable(itemsSource)));rptViewer.RefreshReport();}对于本质上同步的方法你需要将它们包装在你自己的任务中,这样你就可以等待它在你的情况下,我只会使用Task.Run:awaitTask.Run(()=>{rptViewer.LocalReport.DataSources.Add(newReportDataSource("MyData",CoreUtils.ToDataTable(itemsSource)));});还有其他生成任务的方法,但这可能是最简单的方法。如果这更新了UI组件,它可能会抛出异常,因为这些操作必须发生在UI线程上。在这种情况下,尽量让UI相关部分远离长时间运行的部分,并只将长部分包装在任务中。我几乎可以肯定整条线都不是慢线,CoreUtils.ToDataTable(itemsSource)更有可能是慢线,这是需要改进的部分。您没有包含ToDataTable的源ToDataTable所以我不确定最好的方法是什么,第一个也是最好的选择是编写一个新版本的函数,该函数在内部利用异步调用来创建一个允许您等待的函数在上面。vardata=awaitCoreUtils.ToDataTableAsync(itemsSource)rptViewer.LocalReport.DataSources.Add(newReportDataSource("MyData",data));第二个Task.Runlower选项是使用Task.Run在慢段的后台线程上执行,然后根据需要在UI线程上设置数据源。以上就是C#学习教程:关于我要等的方法,等不及了无效分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——vardata=awaitTask.Run(()=>CoreUtils.ToDataTable(itemsSource));rptViewer.LocalReport.DataSources.Add(newReportDataSource("MyData",data));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: