Donnerstag, 20. Januar 2005
System.Threading.Timer und das Ausführen von WebRequests

Das ist wieder einer dieser verdammten Tage wo du Stunden damit verbringst, deinen Code zu debuggen. Irgendwann stellt sich dann das beschissene Gefühl ein, das es nichts mit deinem Code zu tun hat sondern wohl eher ein Bug im .Net Framework sein könnte.

Das Problem liegt darin das ich einen Timer starte der in einer bestimmten Periode einen SOAP WebService aufrufen soll. Alles was man dazu braucht ist eine WebReference im Projekt und eine kleine Anwendung, welche einen System.Threading.Timer instanziert und eine bestimmte Methode aufruft.


   1:  using System;
   2:  using System.Threading;
   3:   
   4:  using Upload.StatusWs;
   5:   
   6:  namespace Upload
   7:  {
   8:      class Upload
   9:      {
  10:          [STAThread]
  11:          static void Main(string[] args)
  12:          {
  13:              StatusService _StatusService = new StatusService();
  14:              StatusUpdate _Update = new StatusUpdate();
  15:   
  16:              Status _Status = new Status();
  17:              _Status.Id = "4711";
  18:              _Status.Seconds = 17;
  19:              _Status.Bytes = new Random(DateTime.Now.Second).Next(100);
  20:              _Status.Total = 1300;
  21:   
  22:              _Update.Status = _Status;
  23:   
  24:              StatusUpdateAntwort _UpdateAntwort = _StatusService.UpdateStatus(_Update);
  25:   
  26:              Console.WriteLine(_UpdateAntwort.Update);
  27:   
  28:              Timer _Timer;
  29:   
  30:              if(true)
  31:                  _Timer = new Timer(
  32:                      new TimerCallback(Status),
  33:                      null,
  34:                      TimeSpan.FromSeconds(3),
  35:                      TimeSpan.FromSeconds(10));
  36:              else
  37:                  while(true)
  38:                  {
  39:                      Status(null);
  40:                      Thread.Sleep(3000);
  41:                  }
  42:   
  43:              Console.ReadLine();
  44:          }
  45:          static void Status(object Sender)
  46:          {
  47:              try
  48:              {
  49:                  using (StatusService _StatusService = new StatusService())
  50:                  {
  51:                      Console.WriteLine("Enter");
  52:                      StatusAnfrage _StatusAnfrage = new StatusAnfrage();
  53:                      _StatusAnfrage.Id = "4711";
  54:                      StatusAntwort _Antwort = _StatusService.GetStatus(_StatusAnfrage);
  55:                      string _Text = "" + _Antwort.Status.Bytes + " " + _Antwort.Status.Total + " " + _Antwort.Status.Seconds + " " + _Antwort.Status.Id;
  56:                      Console.WriteLine(_Text);
  57:                  }
  58:              }
  59:              catch(Exception e)
  60:              {
  61:                  Console.WriteLine(e.Message);
  62:              }
  63:          }
  64:      }
  65:  }

Der Timer startet korrekt. Er schafft es auch die Methode 3 manchmal auch 4 mal abzuarbeiten. Aber dann stellt er seinen Dienst ein ... das wars. Keine Exception, auch kein AppDomain.CurrentDomain.UnhandledException Event wird gefeuert.
True
Enter
65 1300 17 4711
Enter
65 1300 17 4711
Enter
65 1300 17 4711

Das ganze aber hingegen in eine Schleife gepackt läuft bis ans Ende aller Tage. Also scheint der Code in der Methode (Line 45) wohl einwandfrei zu funktionieren.

Ich denke es ist mal wieder an der Zeit sich eine eigene Timerklasse zu bauen oder einfach darauf zu verzichten !

So far,

NXTan

... comment