L'obtention d'un Service à Exécuter à l'Intérieur de l'Azur Rôle de Travailleur

J'ai un service windows que j'ai besoin de migrer sur Azure en tant que Travailleur Rôle. Tout s'appuie très bien dans mon Azure solution. Cependant, quand je télécharge tout seul le rôle commence. Le rôle de travailleur instance est coincé à vélo entre les deux statuts, sans jamais commencer.

  • D'attente pour le rôle de départ...
  • Rôle stabilisateur...

Depuis l'instance, ne parvient pas à démarrer je soupçonne mon problème se situe quelque part dans mon WorkerRole.cs code. Vous trouverez ci-dessous le code. J'ai aussi inclus le code du service dans le cas où il est pertinent pour la question. Qu'ai-je fait de mal?

C'est mon WorkerRole.cs fichier:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Threading;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;
using System.ServiceProcess;

namespace SBMWorker
{
public class WorkerRole : RoleEntryPoint
{

    public override void Run()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new Service1() 
        };
        ServiceBase.Run(ServicesToRun);

        //Thread.Sleep(Timeout.Infinite);
    }

}
}

C'est mon Service1.cs code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using Lesnikowski.Mail;
namespace SBMWorker
{
public partial class Service1 : ServiceBase
{
private System.Timers.Timer mainTimer;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
//config the timer interval
mainTimer = new System.Timers.Timer(foo.Framework.Configuration.SecondsToWaitBeforeCheckingForEmailsToProcess * 1000);
//handling
mainTimer.Elapsed += new System.Timers.ElapsedEventHandler(mainTimer_Elapsed);
//startup the timer.  
mainTimer.Start();
//log that we started
foo.Framework.Log.Add(foo.Framework.Log.Types.info, "SERVICE STARTED");
}
catch (Exception ex)
{
try
{
foo.Framework.Log.Add(ex, true);
}
catch{throw;}
//make sure the throw this so the service show as stopped ... we dont want this service just hanging here like
//its running, but really just doing nothing at all
throw;
}
}
protected override void OnStop()
{
if (mainTimer != null)
{
mainTimer.Stop();
mainTimer = null;
}
//log that we stopped
foo.Framework.Log.Add(foo.Framework.Log.Types.info, "SERVICE STOPPED"); 
}
void mainTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
mainTimer.Stop();
bool runCode = true;
if (runCode)
{
try
{
//call processing
foo.Framework.EmailPackageUpdating.ProcessEmails();
}
catch(Exception ex)
{
try
{
//handle error 
foo.Framework.Log.Add(ex, false);
}
catch { throw; }
}
}
mainTimer.Start();
}
}
}
Pourquoi ne pas vous mettre un try/catch autour de tout et journal de l'exception? (J'ai l'habitude de le faire de cette façon: blog.smarx.com/posts/printf-here-in-the-cloud.) ce serait beaucoup plus facile à corriger que la lecture du code et d'essayer de deviner.
Aussi, faut-il travailler quand vous de l'exécuter localement sous l'émulateur de calcul?
Je me suis séparé de rôle de travail dans une nouvelle solution (séparé de mon rôle web) et j'obtiens un message d'erreur plus spécifique. Quand je le lance en local il me dit "Impossible de démarrer le service de la ligne de commande ou d'un débogueur. Un Service Windows doit d'abord être installé (à l'aide de installutil.exe) et puis a commencé avec la ServerExplorer, les Services Windows l'outil d'Administration ou de la commande NET START."
Oh, peut-être bien ce qu'il dit est vrai. Est-ce de travailler dans une application console (oublier de Windows Azure pour l'instant)?
Il fonctionne comme un service windows si vous l'installez sur un serveur. Je n'étais pas celui qui l'a écrit, mais je suis en train de le réutiliser en tant que travailleur.

OriginalL'auteur hughesdan | 2011-08-11