2013-11-06 2 views
0

В моей программе у меня есть таймер, который, когда он гаснет до 0, я хочу, чтобы мое приложение «подключилось» к службе, а пока оно «подключено», отобразите это кольцо прогресса.Отображение ProgressRing при подключении

Казалось бы, мое кольцо прогресса не активируется до конца функции, в которой он настроен на активное. Но поскольку я жду завершения функции Connect, кольцо прогресса никогда не появляется.

Я пробовал различные методы для решения этой проблемы, но мне не хватает понимания относительно ожиданий/задач/диспетчеризации, чтобы сделать эту работу.

Вот код, относящийся к ProgressRing и функции Connect:

vm.IsConnecting = true; 

await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => vm.Connect()); 

if (vm.ConnectionClear) 
    this.Frame.Navigate(typeof(MainPage), vm); 

vm.IsConnecting = false; 

vm.IsConnecting является то, что IsActive свойство ProgressRing привязан.

Как я могу заставить его отображать progressRing сразу после того, как vm.IsConnecting установлен в true?

Следует отметить, что я нацелен на WinRT, и поэтому мой набор инструментов несколько ограничен.

Странная вещь в этом заключается в том, что у меня есть тот же самый блок кода, что и выше, в EventHandler для нажатия кнопки, и он работает так, как я полагаю. То есть, когда кнопка нажата, отображается ProgressRing, и программа будет выполнять метод подключения, и когда она будет завершена, ProgressRing исчезнет.

private async void Connect_Clicked(object sender, RoutedEventArgs e) 
{ 
    vm.IsConnecting = true; 

    await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => vm.Connect()); 

    if (vm.ConnectionClear) 
     this.Frame.Navigate(typeof(MainPage), vm); 

    vm.IsConnecting = false; 
} 
+0

У вас есть взгляд на BackgroundWorker? Я считаю, что он специально разработан, чтобы позволить фоновым процессам работать с потоком пользовательского интерфейса и сообщать о своем прогрессе, используя свои собственные методы. Не думаю, что это точно ответит, поэтому я не написал это как ответ, но, может быть, хорошая ссылка позже? Посмотрите: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx – Wade

+0

Я отчаянно хотел использовать BackgroundWorkers, так как я использовал их ранее и имею более сильное знание того, как они функционируют. При этом они не включены в набор инструментов WinRT. – khrave

ответ

2

Я считаю, что вы хотите, чтобы разоблачить async метод на вашей виртуальной машине, как таковой:

public async Task ConnectAsync(); 

, которые вы можете использовать, как это:

vm.IsConnecting = true; 

await vm.ConnectAsync(); 

if (vm.ConnectionClear) 
    this.Frame.Navigate(typeof(MainPage), vm); 

vm.IsConnecting = false; 

В качестве общего правило, любое использование Dispatcher является признаком того, что ваш дизайн нуждается в работе.

+0

Я могу удалить фрагмент диспетчера с помощью вашего метода, но он по-прежнему отказывается отображать кольцо выполнения, когда я думаю, что он должен отображаться. Я сделал редактирование оригинального сообщения, которое может или не может дать более глубокое понимание моей проблемы. Благодарю. – khrave

+0

Правильно ли ваш метод 'ConnectAsync' асинхронен? –

+0

Я не знаю, как ответить на этот вопрос. Connect был общедоступным void Connect() и теперь является общедоступным async Task ConnectAsync(). Я предполагаю, что мне нужно больше изменить, но я не хочу ничего ждать в методе Connect. – khrave

Смежные вопросы