2013-04-25 1 views
0

Я пытаюсь обновить методы, ранее использовавшиеся на основе BackgroundWorker, для использования асинхронных вызовов из библиотеки Microsoft.Bcl.Async. Проблема, с которой я столкнулась, - это индикатор занятости, который больше не работает с новой асинхронной функциональностью (для которой я новичок). Индикатор занятости не отображается, графический интерфейс зависает во время выполнения операции, а затем размораживается, когда он завершен. Я не уверен, что я делаю неправильно ...BusyIndicator, не отображающий метод async

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

Edit: Чтобы ответить на @ Джон тарелочкам, здесь важно Части 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'? Если это просто выполняется синхронно, то это не поможет вам ... –

+0

Я добавил некоторый код, чтобы надеяться, прояснить, что он делает. Что-то выделяется как неправильное? – dythim

+0

Ну, какой бит на самом деле требует времени? Это 'SaveReport'? На что это похоже? В принципе, я подозреваю, что вы фактически выполняете большую часть работы с синхронными вызовами. –

ответ

1

Информация не достаточна, чтобы дать вам код для ответа, но в родах l:

Во-первых, поймите, что async не запускает ваш код на фоне потока. Все, что он делает, это создать небольшой конечный автомат, который позволяет выполнять операции await. Аналогично, await не запускает ваш код в фоновом потоке.

Если у вас есть операции с интенсивным использованием процессора, вы должны оттолкнуть их на фоновый поток, используя await Task.Run(..). Любой тип привязки данных считается операцией пользовательского интерфейса, и должно быть выполнено не внутри звонка до Task.Run.

+0

Я думаю, что это прояснило мою путаницу. Разница между асинхронной и фактической фоновой обработкой. – dythim