2013-06-18 112 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綁定*工作。由於您使用的方法不會阻止UI線程,只需從UI線程直接執行。 – Servy

+0

@Servy是的,但我想更新我正在閱讀的值。讓我們說1秒。所以我想過把它放到後臺工作。可能嗎?或者有另一種方式? – sparcopt

+0

你不想在這裏使用BGW。它的目的不是爲了幫助你做到這一點。你可能能夠做任何你想做的事情,但是你還沒有告訴我們你真正想用這種異步方法做什麼,而你目前做不到。賠率是,如果可能的話,它不會利用BGW來做到這一點。 – Servy

回答

0

好,我設法得到它的工作!

對於任何想要不時自動運行一些異步代碼的人來說,忘記背景工作者,你要找的是一個計時器。 謝謝Servy的計時器提示。

假設我想每5秒呼叫asyncCall

這很簡單。首先定義兩次通話之間的等待時間(您希望在再次調用相同的代碼之前等待多久)。

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