gpt4 book ai didi

c# - 忙碌指示灯不工作

转载 作者:行者123 更新时间:2023-11-30 16:48:34 26 4
gpt4 key购买 nike

我正在 Visual Studio 2015 中构建一个 MVVM Light WPF 应用程序。它有一个用户控件,其中包含一个 WindowsFormsHost 和一个用于 SQL Server Reporting Services 本地报告的 ReportViewer . ReportView.xaml 中的按钮调用一个命令,该命令又将消息发送到 MasterListView.xaml 的代码隐藏以生成报告。

这是 ReportViewModel.cs 中的按钮调用的命令:

public ICommand RunReportRelayCommand =>
new RelayCommand(async ()=> { await RunReport(); });

private async Task RunReport()
{
try
{
IsBusy = true;
await Task.Run(() =>
{
Messenger.Default.Send(true, "RunMasterListReport");
});
}
finally
{
IsBusy = false;
}
}

这是 ReportViewModel.csIsBusy 属性的定义:

private bool _isBusy;
public bool IsBusy
{
get { return _isBusy; }
set
{
if (value == _isBusy) return;
_isBusy = value;
RaisePropertyChanged();
}
}

包含调用上述命令的按钮的相同 View ReportView.xaml 还包含以下扩展 WPF 工具包忙碌指示器:

<UserControl>
<UserControl.Resources>
<DataTemplate x:Key="MasterListViewTemplate">
<view:MasterListView />
</DataTemplate>
</UserControl.Resources>
<xctk:BusyIndicator IsBusy="{Binding IsBusy}">
<StackPanel>
<!-- Other XAML here -->
<ContentControl ContentTemplate="{StaticResource MasterListViewTemplate}" />
</StackPanel>
</xctk:BusyIndicator>
</UserControl>

然后在 MasterListView.cs 代码隐藏中,我们有这个:

public partial class MasterListView : UserControl
{
public MasterListView()
{
InitializeComponent();
Messenger.Default.Register<bool>(this, "RunMasterListReport", RunMasterListReport);
}

public async void RunMasterListReport(bool val)
{
await Task.Run(() =>
{
var dataSet = new DrugComplianceDataSet();
dataSet.BeginInit();
ReportViewer.ProcessingMode = ProcessingMode.Local;
ReportViewer.LocalReport.ShowDetailedSubreportMessages = true;
ReportViewer.LocalReport.DataSources.Clear();
var dataSource = new ReportDataSource
{
Name = "MasterListRandomDataSet",
Value = dataSet.MasterListRandom
};
ReportViewer.LocalReport.DataSources.Add(dataSource);
ReportViewer.LocalReport.ReportEmbeddedResource = "MasterListRandom.rdlc";
dataSet.EndInit();
var adapter = new MasterListRandomTableAdapter { ClearBeforeFill = true }
.Fill(dataSet.MasterListRandom);
Dispatcher.Invoke((MethodInvoker)(() => { ReportViewer.RefreshReport(); }));
});
}
}

但是,忙碌指示器不会触发,尽管报告会在 5 秒左右后显示。我究竟做错了什么?谢谢。

最佳答案

你那里有一整汤汤。像

这样的事情
await Task.Run(() =>

表明您并不真正了解 async/await 的工作原理。我会下台并找到一些不错的文档来阅读。此外,您似乎是在 UI 线程上完成所有工作。

Dispatcher.Invoke((MethodInvoker)(() => { ReportViewer.RefreshReport(); }));

除非您正在更新 UI,否则您不应该在后台工作人员中接触调度员。看来您正在卸载您打算在 UI 线程的后台线程(刷新报告)中执行的实际工作。

也许您的报表查看器必须在 UI 线程中运行。如果是这样(也许它是不久前设计的并且没有利用多任务处理),那么您对这种情况无能为力。您的用户界面在处理过程中将被锁定。

如果您所有的长时间运行的工作都必须在 UI 线程上运行,那么去掉所有这些废话。在开始工作之前,更新 IsBusy,然后将 ReportViewer.RefreshReport() 的执行卸载到 Dispatcher 上,但使用低优先级 DispatcherPriority ,以便它在 UI 更新后运行并显示它正忙。您的 UI 在处理过程中将被卡住,但至少您会向用户提示正在发生的事情。

关于c# - 忙碌指示灯不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37949395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com