2013-10-15 81 views
1

需要一個解決方案後臺代理不執行.:的Windows Phone 8

背景代理工作的只有一次。在沒有發生背景代理之後。它在第一時間工作,一旦頁面打開,它就可以完美工作。然而,在此之後,它永遠需要再次這樣做。有時頁面關閉並打開不起作用。將可能因爲無法去除agenet

我的背景代理代碼:

#define DEBUG_AGENT 
using System; 
using System.Windows; 
using Microsoft.Phone.Scheduler; 
using Microsoft.Phone.Shell; 
using Microsoft.Phone.Info; 
using System.Linq; 
using System.Windows.Controls; 
using System.Windows.Navigation; 
using Microsoft.Phone.Controls; 
using System.Threading; 
using Microsoft.Xna.Framework.Media; 
using System.Windows.Input; 
using Microsoft.Devices; 
using System.IO; 
using System.IO.IsolatedStorage; 
using System.Windows.Media.Imaging; 
using System.Net.Sockets; 
using System.Text; 
using System.Net; 

namespace ScheduledTaskAgent1 
{ 
    public class ScheduledAgent : ScheduledTaskAgent 
    { 

     private static volatile bool _classInitialized; 
     //private DispatcherTimer s; 
     Socket _socket = null; 
     ManualResetEvent _clientDone = new ManualResetEvent(false); 
     const int TIMEOUT_MILLISECONDS = 5000; 
     const int MAX_BUFFER_SIZE = 2048; 
     double lat = 7.16126666666667; 

     static ScheduledAgent() 
     { 
      // Subscribe to the managed exception handler 
      Deployment.Current.Dispatcher.BeginInvoke(delegate 
      { 
       Application.Current.UnhandledException += UnhandledException; 
      }); 
     } 

     /// Code to execute on Unhandled Exceptions 
     private static void UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) 
     { 
      if (System.Diagnostics.Debugger.IsAttached) 
      { 
       // An unhandled exception has occurred; break into the debugger 
       System.Diagnostics.Debugger.Break(); 
      } 
     } 

     protected override void OnInvoke(ScheduledTask task) 
     { 
      //TODO: Add code to perform your task in background 
      string toastTitle = ""; 

      _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

      lat += 0.001; 
      string snmea = DD2NMEA(lat, 80.44506); 

      string dates = DateTime.UtcNow.ToString("ddMMyy"); 

      string UTCTime = DateTime.UtcNow.ToString("hhmmss") + ".000"; 

      string s1 = Checksum("$FRCMD,869444005499999,_SendMessage,,0809.67600,N,8050.70360,E,1.0,1.08,3.0,141013,055642.000,1,Button1=1,Button2=0,Switch1=1,Switch2=0,Analog1=4.00,Analog2=5.00,SosButton=0,BatteryLow=0,Text1=Text1,Text2=Text2*00"); 

      string s = Send("$FRCMD,869444005499999,_SendMessage,," + snmea + ",1.0,1.08,3.0," + dates + "," + UTCTime + ",1,Button1=1,Button2=0,Switch1=1,Switch2=0,Analog1=4.00,Analog2=5.00,SosButton=0,BatteryLow=0,Text1=Text1,Text2=Text2*00"); 


       startToastTask(task, toastTitle); 

     } 

     private void startToastTask(ScheduledTask task, string toastTitle) 
     {    

#if DEBUG_AGENT 
      ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(10)); 
#endif 

      // Call NotifyComplete to let the system know the agent is done working. 
      NotifyComplete(); 
     } 
} 
} 

我從應用程序頁面這就要求代理

PeriodicTask toastPeriodicTask; 

const string toastTaskName = "ToastPeriodicAgent"; 



protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
     { 
      toastPeriodicTask = ScheduledActionService.Find(toastTaskName) as PeriodicTask; 

StartPeriodicAgent(toastTaskName); 
} 

private void StartPeriodicAgent(string taskName) 
     { 
      toastPeriodicTask = ScheduledActionService.Find(taskName) as PeriodicTask; 

      if (toastPeriodicTask != null) 
      { 
       RemoveAgent(taskName); 
      } 
      toastPeriodicTask = new PeriodicTask(taskName); 

      toastPeriodicTask.Description = periodicTaskDesc; 

      try 
      { 
       ScheduledActionService.Add(toastPeriodicTask); 

#if(DEBUG_AGENT) 
       ScheduledActionService.LaunchForTest(taskName, TimeSpan.FromSeconds(2)); 
#endif 
      } 
      catch (InvalidOperationException exception) 
      { 
       if (exception.Message.Contains("BNS Error: The action is disabled")) 
       { 
        MessageBox.Show("Background agents for this application have been disabled by the user."); 
       } 
       else if (exception.Message.Contains("BNS Error: The maximum number of ScheduledActions of this type have already been added.")) 
       { 
        MessageBox.Show("BNS Error: The maximum number of ScheduledActions of this type have already been added."); 
       } 
       else 
       { 
        MessageBox.Show("An InvalidOperationException occurred."); 
       } 
      } 
      catch (SchedulerServiceException) 
      { 

      } 
     } 

回答

3

確保您的項目已DEBUG_AGENT定義。這是您的項目屬性中的一個設置。要設置此標誌,請按照下列步驟

  1. 右擊內VS並選擇屬性
  2. 項目選擇Build選項卡
  3. 添加DEBUG_AGENT的「條件編譯符號」字段。

如果設置了,我發現最好在LaunchForTest中至少放30秒。有時,當你告訴它的時候,它不會很安排。