2013-06-18 3 views
-1

Я нашел несколько примеров в Интернете, но мне трудно с трудом запускать мой асинхронный вызов внутри рабочего стола. Я работаю в WP8. Чего не хватает?Запуск асинхронного кода внутри backgroundworker

Редактировать: Целью этого является обновление значений, которые я читаю время от времени. Скажем, 1 с.

Вот мой асинхронной код, он просто получает и хранит некоторые данные в провайдеров []:

public void getAllProvidersMethod() 
     { 
      try 
      { 
       sc.getAllProvidersCompleted += new EventHandler<ServiceReference1.getAllProvidersCompletedEventArgs>(callback); 
       sc.getAllProvidersAsync(); 
      } 
      catch (System.Exception e) 
      { 
       MessageBox.Show(e.ToString()); 
      } 
     } 

public void callback(object sender, ServiceReference1.getAllProvidersCompletedEventArgs e) 
     { 
      try 
      { 
       providers = new String[e.Result.Length]; 
       for (int i = 0; i < e.Result.Length; i++) 
       { 
        providers[i] = e.Result[i].ToString(); 
       } 
      } 
      catch (System.Exception d) 
      { 
       MessageBox.Show(d.ToString()); 
      } 
     } 

Это мой фон работник:

private void networkWorker() 
     { 
      var obj = App.Current as App; 
      BackgroundWorker bw = new BackgroundWorker(); 

      bw.DoWork += new DoWorkEventHandler(
     delegate(object o, DoWorkEventArgs args) 
     { 
      BackgroundWorker b = o as BackgroundWorker; 

       getAllProvidersMethod(); 

     }); 

      bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
     delegate(object o, RunWorkerCompletedEventArgs args) 
     { 
      MessageBox.Show(" "); 
     }); 

      bw.RunWorkerAsync(); 
     } 
+0

Почему вы используете BGW вообще, если ваша операция асинхронна? Основная цель BGW заключается в длительной работе * CPU bound *. Поскольку метод, который вы используете, не будет блокировать поток пользовательского интерфейса, просто выполните его непосредственно из потока пользовательского интерфейса. – Servy

+0

@Servy Да, но я хочу обновлять значения, которые я читаю время от времени. Скажем, 1 с. Поэтому я подумал о том, чтобы поместить его в фонового работника. Является ли это возможным? Или есть другой способ? – sparcopt

+0

Здесь вы не захотите использовать BGW. Это просто не поможет вам это сделать. Вы можете делать все, что хотите, но вы не сказали нам, что вы на самом деле хотите сделать с этим методом асинхронизации, который вы в настоящее время не можете. Коэффициенты, если это возможно, не будут использовать BGW для этого. – Servy

ответ

0

Хорошо мне удалось получить его работу!

Для тех, кто хочет время от времени запускать какой-либо асинхронный код, забыть о работниках фонового рисунка, то, что вы ищете, - это таймер. Спасибо Servy за подсказку таймера.

Предположим, я хочу позвонить asyncCall за каждые 5 секунд.

Это очень просто. Сначала определите, сколько времени занимает время ожидания между вызовами (как долго вы хотите, чтобы он дождался повторного вызова того же кода).

System.Windows.Threading.DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer(); 
dt.Interval = new TimeSpan(0, 0, 0, 0, 5000); // HERE - for example 5000 is 5 seconds 
dt.Tick += new EventHandler(dt_Tick); 
dt.Start(); 

И тогда все, что вам нужно, это написать код, который вы хотите повторить внутри этого метода:

void dt_Tick(object sender, EventArgs e) 
{ 
      asyncCall(); 
} 

В этом случае на каждые 5 секунд он будет вызывать asyncCall.

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