2013-10-25 5 views
0

Я собираюсь выполнить несколько обновлений в приложении Windows Phone 7, и один из них включает в себя приостановку приложения на долю секунды без блокировки пользовательского интерфейса. Я не уверен в лучшем способе сделать это. В Windows Phone 8 я ссылается How to Pause without Blocking the UI, в котором я сделалКак приостановить приложение без блокировки UI

void newButton_Click(object sender, EventArgs e) 
{ 
    if (Settings.EnableVibration.Value) //boolean flag to tell whether to vibrate or not 
    { 
     VibrateController.Default.Start(); 
     Task.Delay(100); 
    } 
    ... 
} 

Task.Delay Но я не нашел в Windows Phone 7. Любые предложения или рекомендации?

+0

Использование фоновой нити или что-то еще. Кажется, вы ничего не делаете там, кроме паузы ... поэтому, почему вы хотите приостановить работу без блокировки ui? Что ты пытаешься сделать ? – Noctis

+1

Я не совсем уверен, что вы подразумеваете под «Приостановить приложение без блокировки интерфейса». Что именно вам нужно «приостановить»? Это игра, в которой пользовательский интерфейс должен работать, в то время как сама игра приостановлена? Или вы хотите приостановить выполнение чего-то, что происходит в фоновом режиме? –

+0

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

ответ

0

Это работает в окнах 8, и я предполагаю, что это сработает и для вас. Если у вас есть процесс постоянно работает в фоновом режиме, с помощью задачи, вы можете сделать это:

Определить то, что работает в фоновом режиме:

Определить задачи и логическое значение, чтобы перевернуть, когда вы хотите сделать паузу

Task doStuff; 
    static bool pauseTask = false; 

Определить задачи, где это необходимо:

doStuff = new Task(LoopForMe); 
    doStuff.Start(); 

функцию, которая просто делает что-то

private async static void LoopForMe() 
    { 
     //Keep thread busy forever for the sake of the example 
     int counter = 0; 
     while (true) 
     { 
      //Define pauseTask as a static bool. You will flip this 
      //when you want to pause the task 
      if (pauseTask) 
      { 
       await Task.Delay(100000); 
       pauseTask = false; 

      } 

      Debug.WriteLine("working... " + counter); 

      counter++; 
      //Do something forever 
     } 
    } 

А в вашем случае, вы можете перевернуть BOOL:

pauseTask = true; 

Я должен отметить несколько недостатков в этом, однако. Я бы нашел способ определить, когда задача, которая должна «приостановить» фоновый код запуска, сможет разблокировать фоновый поток. Этот пример просто заставил поток ждать чего-то определенного времени. Я бы перевернул bool взад и вперед на основе кода, который должен «блокировать» его. Другими словами, блокируйте и разблокируйте поток по мере необходимости, а не полагайтесь на таймер. Этот подход должен держать вас UI еще работающим во время работы в Task (поток a.k.a.) от выполнения какой-либо работы в течение заданного промежутка времени.

Здесь много подводных камней. Как заставить поток ждать без таймера? Теперь вы попадаете в более сложную логику ожидания потока. Преимущество вышеприведенного кода заключается в том, что он находится в цикле. Как вы это делаете, если это не так? К сожалению, вы задали свой вопрос довольно неопределенно, поэтому я действительно не знаю, что именно вы пытаетесь «приостановить». Пожалуйста, используйте приведенный выше код в качестве отправной точки.

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