2013-04-25 49 views
0

我试图升级基于BackgroundWorker的方法以使用来自Microsoft.Bcl.Async库的异步调用。我遇到的麻烦是繁忙的指标不再适用于新的异步功能(我是新来的)。繁忙指示符不显示,GUI执行时冻结,然后在完成时解冻。我不知道我做错了什么......BusyIndi​​cator不从异步方法显示

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; 
} 

编辑: 要回复@乔恩飞碟双向,这里是重要的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; 
    } 
+1

ReportManager.CreateReport是做什么的?如果这只是同步执行,那么它不会帮助你... – 2013-04-25 22:21:08

+0

我已经添加了一些代码,希望澄清它在做什么。有什么东西突出是错的吗? – dythim 2013-04-25 22:44:59

+0

那么哪个位实际需要时间?它是“SaveReport”吗? * *看起来像什么?基本上,我怀疑你实际上在做同步调用的大部分工作。 – 2013-04-25 22:51:48

回答

1

没有足够的信息为您提供答案代码,但属于l:

首先,意识到async不会在后台线程上运行您的代码。它所做的只是创建一个能够启动await操作的小型状态机。同样,await不会在后台线程上运行您的代码。

如果您有CPU密集型操作,则应使用await Task.Run(..)将它们推送到后台线程。任何类型的数据绑定都被认为是UI操作,并且应该在Task.Run的调用中完成而不是

+0

我认为这已经清理了很多我的困惑。异步和实际后台处理之间的区别。 – dythim 2013-04-25 23:53:14

相关问题