1

NEED A SOLUTION

Background agent is working only once. After There is no occurrence of a background agent. It works at the first time and it works perfectly as soon as the page opens. however, after that it takes forever and ever to do that again. sometimes page close and open doesn't work. that would probably because of not removing the agenet

My background Agent Code:

#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();
        }
 }
}

My Page from app which calls the agent

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)
            {

            }
        }
4

1 回答 1

3

确保您的项目已定义 DEBUG_AGENT。这是您的项目属性中的设置。要设置此标志,请按照下列步骤操作

  1. 右键单击VS中的项目并选择属性
  2. 选择构建选项卡
  3. 将 DEBUG_AGENT 添加到“条件编译符号”字段。

如果已设置,我发现最好在 LaunchForTest 中至少留出 30 秒。有时,当您告诉它时,它并没有完全安排好它。

于 2013-10-16T22:58:26.420 回答