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
Hallo msimmerl
Liest dir mal folgenden Beitrag durch:
Terminausnahmen in einer Terminserie
Gruss
David
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
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
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
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
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
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;
..
.
}
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
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