Laden...
Z
zino
myCSharp.de - Member
3
Themen
24
Beiträge
Letzte Aktivität
vor 11 Jahren
Dabei seit
17.11.2009
Alter
53
Beruf
Datenmanager/Softwareentwickler
Herkunft
Schweiz - Winterthur
Interessen
Familie, Wein
Erstellt vor 11 Jahren

Hallo zusammen

Ich bin schon seit einigen Tagen an folgendem Problem. Ich habe einen Windowsdienst erstellt, der 24 Stunden am Tag läuft. Die Aufgabe des Dienstes ist es, je nach Tageszeiten Anrufe einer Telefonanlage automatisch anzunehmen und weiter zu leiten. Der Dienst ist schon seit längerer Zeit in Betrieb und bewältigt diese Aufgabe zu vollsten Zufriedenheit.

Bei einer geplanten Erweiterung ist mir aber im Process-Explorer etwas unschönes Aufgefallen. Via Timer werden alle x Sekunden Überprüfungen vorgenommen. Dabei erhöht sich bei jedem Aufruf der Prüfmethode die Anzahl der Handles. Der Speicher und die Anzahl der Threads bleibt dabei Stabil. Ich habe es mit dem Timer von System.Timers und System.Threading.Timer probiert mit jeweils gleichem Effekt.

Untenstehend ein Ausschnitt meines Codes:


 class MyClass
 {
     private pbx _pbx;
     private List<PBX_User> _userInfo_list;
     private System.Threading.Timer _echo_timer;
     private ReaderWriterLock _lockUserList;
     ..
     .
     public volatile bool m_stopService;

     public MyClass()
     {
         //.
         //..
         //Timer initialisieren
         TimerCallback cb = new TimerCallback(echo_aufruf);
         _echo_timer = new Timer(cb);
         _echo_timer.Change(10000, 10000);
     }

     //Prüfen ob PBX-Session noch gültig ist
     private void echo_aufruf(object timerState)
     {
         if (!m_stopService)
         {
             //Schreibschutz setzen    
             _lockUserList.AcquireReaderLock(Timeout.Infinite);
             try
             {
                 if (_userInfo_list.TrueForAll(
                         delegate(PBX_User usr)
                         {
                             return (usr.User_State == 0);
                         }
                     ))
                 {   //Wenn alle Anschlüsse inaktiv sind wird die PBX-Session geprüft
                     _pbx.EchoAsync(m_session_handle, m_key);
                 }
                 else
                     Log.writeLog(Texte.TXT_INFORMATION, "PBX-Status = true", m_debug);
             }
             finally
             {
                 _lockUserList.ReleaseReaderLock();
             }
          }
     }
 }

Ich wäre für jeden Tipp danbar 🙂

Gruss
David

Erstellt vor 11 Jahren

Hallo msimmerl

Liest dir mal folgenden Beitrag durch:
Terminausnahmen in einer Terminserie

Gruss
David

Erstellt vor 14 Jahren

Du muss nur folgendes angeben:


oSession.LogonExchangeMailboxEx(this.exUser, this.exServer, false, false, false, false);

this.exServer enthält den Namen des Exchange-Servers und
this.exUser den Namen des freigegebenen Kalenders.

Natürlich braucht der User unter dem der Service läuft die entsprechenden Berechtigungen (auf Exchange/Outlook) um den Kalender zu lesen.

Die Beschreibung aller Objekte, Methoden; Properties und Events findest du unter Redemption Data Objects

Gruss
David

Erstellt vor 14 Jahren

Hoi hur


//Session initialisieren
RDOSession oSession = RDOSession();

//Mit Exchange connecten
oSession.LogonExchangeMailboxEx(this.exUser, this.exServer, false, false, false, false);

if (oSession.ExchangeConnectionMode == rdoExchangeConnectionMode.olOnline)
{
   //Enddatum setzen
   DateTime eDate = new DateTime();
   eDate = DateTime.Today.AddDays(1).AddSeconds(-1);

   //Kalender
   RDOFolder oCalendar = oSession.GetDefaultFolder(rdoDefaultFolders.olFolderInbox);
   oCalendar.Items.Sort("Start", "false");

   //Normale Termine
   string filter = "[Start] < '" + eDate.ToString("s") + 
                   "' And [End] > '" + DateTime.Now.ToString("s") + 
                   "' And [IsRecurring] = 'False'";

   foreach (RDOAppointmentItem oAppt in oCalendar.Items.Restrict(filter))
   {  //Alle Termine von jetzt bis Mitternacht lesen
      string subject = oAppt.Subject;
      ...
      ..
      .
   }
}

//Session schliessen
 if (this.oSession.LoggedOn) { this.oSession.Logoff(); }

Marshal.ReleaseComObject(oSession);

Gruss
David

Erstellt vor 14 Jahren

Hoi hur

Würde dir auch Redemption ans Herz legen. Habe damit einen Absenzenservice erstellt der anhand Terminen/Serientermine aus Exchange die Umleitungen einer VOIP-Anlage steuert.

Der Zugriff über Redemption auf Exchange ist recht einfach gehalten. Stolpersteine können Serientermine sein, die man anhand eines "Pattern" und dem (Start-)Termin selber berechnen muss. Kann mir aber vorstellen, dass Serientermine in deinem Fall keine Rolle spielen.

Gruss
David

Erstellt vor 14 Jahren

Hoi infinity

Welche Version hat der Verweis auf Microsoft.Office.Interop.Excel? Der Verweis sollte mind. auf die Version 12.0 erfolgen.

Siehe auch Office Primary Interop Assemblies

Gruss
David

Erstellt vor 14 Jahren

Hoi mdcc

Wie gesagt, du musst alle einzelnen Termine ausgehend vom Erstellungsdatum des Serientermins selber berechnen. Das heisst also, wenn der Serientermin vor einem Jahr erstellt wurde, muss dieser gelesen und anhand der Klasse

RDORecurrencePattern 

die einzelnen Termine der Serie aufbereitet werden.

Was genau ist dein Problem? Wird der "Ursprungstermin" eingelesen? Poste doch mal ein wenig Code. Mich würde z.B. interessieren wie du auf die Serientermine zugreifst. Wird ein Filter gesetzt oder werden einfach alle Termine ever eingelesen? Interessant wäre auch, wie du die einzelnen Termine einer Serie berechnest.

Wie sieht den die Serie aus, die dir Mühe macht:
Termin?
Serienmuster?
Seriendauer?

Gruss
David

Erstellt vor 14 Jahren

Hoi Xenolith

Filtern kannst du die Items des Ordners wie folgt:


Folder inbox = olNS.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

//Emailadresse ...
string filter = "[SenderEmailAddress] = 'hans.muster@muster.com'";

// ... oder Name
string filter = "[SenderName] = 'Hans Muster'";

foreach (Mail mail in inbox.Items.Restrict(filter))
{
    string sub = mail.Subject;
    string adr = mail.SenderEmailAddress;
    string nam = mail.SenderName;
     ..
     .
    }

Erstellt vor 14 Jahren

Hoi Mdcc

Mit viel Fleiss, Geduld und Frust konnte ich alle Probleme lösen und das Teil läuft mittlerweile sein einigen Monate produktiv 8) .

Zu deiner Frage. Im

RecurrenceType

vom

RDOAppointmentItem

findest du heraus um welchen Serientyp es sich handelt.

olRecursDaily, olRecursMonthly ,olRecursMonthNth, olRecursWeekly, olRecursYearly oder olRecursYearNth

Mit

Interval

findest du die Häufigkeit heraus. Die Wochentage sind im Pattern

RDORecurrencePattern oRecPat = oAppt.GetRecurrencePattern()

der Klasse

RDOAppointmentItem

hinterlegt. Dabei gilt folgende Regel:


            switch (flag)
            {
                case 1:
                    this.sunday = true;
                    break;
                case 2:
                    this.monday = true;
                    break;
                case 4:
                    this.tuesday = true;
                    break;
                case 8:
                    this.wednesday = true;
                    break;
                case 16:
                    this.thursday = true;
                    break;
                case 32:
                    this.friday = true;
                    break;
                case 64:
                    this.saturday = true;
                    break;
            }

Enthät das Pattern also den Wert 20, der Interval ist 2 und der RecurrenceType ist olRecursWeekly ist der Serientermin alle 2 Wochen am Dienstag und Donnerstag gültig. Das Problem ist, dass du anhand dem Startdatum

PatternStartDate

selber ausrechnen musst, wann du dich in einer gültigen Woche befindest. Wurde der Serientermin z.B. am 1. Feb. 2008 angelegt musst du dieses Datum als Ausgangspunkt nehmen.

Dazu muss auch geprüft werden ob einzelner Termin in der Serie gelöscht oder verschoben wurde. Dies findest du mit der

Exceptions

Methode aus der Klasse

RDORecurrencePattern

heraus. Mit den Methoden der Klasse

RDOExceptions

kannst du danach prüfen ob der Termin gelöscht oder verschoben wurde.

Gruss
David

Erstellt vor 14 Jahren

Hoi Fil

Soweit ich den Beitrag von Microsoft interpretiere, müsstest du es mit der GetItem Operation statt der FindItem Operation versuchen. Leider habe ich damit aber auch keine Erfahrung.

Alternativ könntest du das ganze auch mit Redemption realisieren (ist kostenpflichtig). Damit funktioniert es bei mir.

Gruss
David

10 von 24 Beiträgen