我正在尝试升级以前基于BackgroundWorker的方法,以使用来自Microsoft.Bcl.Async库的异步调用。我遇到的麻烦是繁忙的指示灯不再适用于新的异步功能(我是新手)。忙指示符不显示,GUI在操作执行时冻结,然后在完成时解冻。我不确定我做错了什么......
XAML代码:
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="5,5,15,15" Background="#FFA8A9AC" Grid.Column="1" Grid.Row="1">
<Grid x:Name="UIGrid">
<toolkit:BusyIndicator x:Name="BusyIndicator" IsBusy="{Binding Instance.IsBusy}" BusyContent="{Binding Instance.BusyMessage, TargetNullValue='Please wait...'}" >
<Grid x:Name="ScreenGrid" />
</toolkit:BusyIndicator>
</Grid>
</Border>
代码
// Button click handler.
private async void NewReportClick(object sender, RoutedEventArgs e)
{
SystemLog.Trace(this);
await this.CreateReport();
}
// Async implementation.
private async Task CreateReport()
{
SystemLog.Trace(this);
await this.CloseReport();
BusinessLogic.Instance.BusyMessage = "CREATING new report...";
BusinessLogic.Instance.IsBusy = true;
await BusinessLogic.Instance.ReportManager.CreateReport();
BusinessLogic.Instance.IsBusy = false;
BusinessLogic.Instance.BusyMessage = null;
}
编辑: 要回复@Jon Skeet,以下是CreateReport的重要部分:
public async Task CreateReport()
{
SystemLog.Trace(this);
var internalReportId = GenerateReportId();
var rpt = await ReportFactory.Create();
rpt.InternalReportId = internalReportId;
rpt.EnableNotifications = true;
ReportRepository = new ReportRepository();
await SaveReport(rpt);
// Set the active report.
BusinessLogic.Instance.ActiveReport = rpt;
await AssignReportNumber(MediViewData.Instance.ActiveReport);
}
public async static Task<Report> Create()
{
var rpt = new Report();
/** Set several fields to default values. */
return rpt;
}
答案 0 :(得分:1)
没有足够的信息为您提供答案的代码,但总的来说:
首先,要意识到async
不会在后台线程上运行您的代码。它所做的就是创建一个支持await
操作的小型状态机。同样,await
不会在后台线程上运行您的代码。
如果您有CPU密集型操作,则应使用await Task.Run(..)
将它们推送到后台线程。任何类型的数据绑定都被视为UI操作,并且 不应在Task.Run
的调用中完成。