Laden...

Forenbeiträge von mosspower Ingesamt 456 Beiträge

12.01.2010 - 21:35 Uhr

Hallo,

ein Anbieter stellt einen Webservice zur Verfügung, den er komplett in Java programmiert hat. Wäre alles doll und gut, wenn er sich an Standards gehalten hätte.

Leider hat er Apache/Axis-Datentypen verwendet, die mittels .NET nicht aufgelöst werden können. Somit wurde ein Java-Client programmiert um das Teil schnell und dirty produktiv nutzen zu können.

Jetzt geht es an die Optimierung und dafür bin dann wohl ich zuständig 😁

Wir haben (fast) alles mittels C# programmiert und optimal wäre es, wenn auch der Aufruf mittels einen C#-Programm gelingen könnte. Nun dachte ich, dass es doch eine Lösung geben muss, und zwar mit plain SOAP-Messages, denn der Client auf unterster Ebene schickt ja nur XML an den Server und der wieder XML zurück.

Imo muss es doch gehen, wenn der C#-Client eine fertige SOAP-Message an den Java-Server schickt und dieser schickt ja auch nur plain SOAP-Messages zurück. die dann eben auf einer anderen Ebene nicht auf die generierten Objekte reflektiert werden sollen, sondern soz. selbst ausgewertet werden.

Nun habe ich aber nichts im Web gefunden diesbezüglich. Auch bekomme ich es nicht einmal hin, ein "stink normalen WCF-Service" mittels SOAP-Messages aufzurufen.

Kann mir da jemand helfen, bzw. hat hier jewmand Links für mich zum Einlesen?

Danke schon mal für etwaige Antworten im Voraus.

18.09.2009 - 20:38 Uhr

Hast du evtl. einen Schnipsel Code der das ganze reproduzierbar macht?
[EDIT]
Ah, o.k. dann scheints ja zu passen.

Naja, ich mache einfach das Panel leer (Clear) und füge das vorher instanzierte UserControl hinzu (Add). Wenn ich bei der vorherigen Anzeige gescrollt habe und die Eigenschaft Top des UserControls nicht auf 0 setze, dann zeigt er mir das Usercontrol zwar so an, wie zuletzt gesehen, jedoch passt die Scrollbar nicht mehr, weil die genau an dieser Stelle beginnt (was vorher aber z.B. in der Mitte war).

Ups, da habe ich nicht gleich Dein EDID gesehen 😁

18.09.2009 - 20:31 Uhr

Ich habe es hinbekommen. Problem war, dass, aus welchen Gründen auch immer, die Y-Position auf einem Minuswert war. Das bedeutet, wenn ich die Eigenschaft Top auf 0 setze, dann funktioniert es, denn dann passt die Scrollbarlänge wieder.

Jetzt ist aber noch das Problem, wenn ich die Anzeige so möchte, wie im Ausgangspost, was kann ich dann machen, dass die Scrollbar "die richtige Länge" hat und nicht anfängt bei dem Minuswert des Panelcontrols, was ja bedeutet, dass alles oberhalb von 0 nicht mehr angescrollt werden kann. Echt sehr komisches Problem.

Ich werde die jetzt immer auf 0 setzen und die vorherige Scrollposition zwischenspeichern und dann wieder ansteuern ... vielleicht nicht die sauberste Lösung, dafür die Schnellste. Also, mache ich den Thread gleich mal auf fixed.

@jaensen,
danke für Deine Hilfe!

18.09.2009 - 20:12 Uhr

Hallo "Kollegen",

ich hoffe jemand kann mir helfen für ein sehr komisches Verhalten.

Ich habe ein Menu, wenn ich auf einen Eintrag klicke, dann wird ein UserControl instanziert und an einen Panel geadded. Panel hat autoscroll auf true gesetzt.

Das funzt auch alles wie gewünscht. Problem ist, dass wenn ich später nochmal auf den Menüeintrag klicke, dann möchte ich nicht eine neue Instanz verwenden, sondern die initial erstellte. Wenn ich aber im Fenster vorher an eine Stelle im UserControl gescrollt habe, dann zeigt der mir beim wieder Hinzufügen an das Panel die gleiche Stelle an, wie zuletzt sichtbar war. So, das Problem hier ist aber, dass die Scrollbar (vom Panel) hier bei 0, 0 steht, das bedeutet, ich kann nicht mehr nach oben scrollen.

Hat jemand eine Idee, wie ich das lösen kann. Mit den Eigenschaften ScrollXXX habe ich nichts erreicht. Problem ist halt, dass wenn z.B. beim initialen Laden die Scrollbar 1000 hoch ist, dann ist sie später, wenn gescrollt wurde, z.B. nur noch 500 hoch und ich kann, wie gesagt, nicht mehr nach oben scrollen, weil eben die Scrollbar genau an der letzten Ausstiegsstelle beginnt.

Ich hoffe, ich konnte es einigermaßen erklären und ihr habt es verstanden. Noch toller wäre, wenn jemanden dieses Verhalten bekannt ist und mir einen Lösungsvorschlag posten könnte.

Gruß und vielen Dank für etwaige Antworten schon einmal im Voraus.

26.06.2009 - 04:35 Uhr

OK, ich habe selbst eine Lösung gefunden - war schon spät vorhin 😁

Ich lasse nur ein Interval (soz. als Listener) laufen und manipuliere die (Daten) Objekte, die in der Interval-Function abgefragt werden - somit ist sichergestellt, dass alle Elemente gleichzeitig den Status ändern (blinken).

Gruß

26.06.2009 - 00:12 Uhr

Hallo "Kollegen",

Wenn sich in einer Tabelle Werte ändern, z.B. Preise von Aktien, möchte ich eine Minute das so anzeigen, dass immer der neue Wert angezeigt wird und nach einer Sekunde die Differenz der Änderung - somit erreicht man einen Blinkeffekt und die aktuellen Änderrungen sieht man sofort.

So die technische Umsetzung ist ja kein Problem - einfach mit JavaScript ein Interval starten und gut ist. Das Problem das ich habe ist, dass sich beim Blinken innerhalb der einen Minute andere Werte ändern können, die ich natürlich dann auch genauso anzeige. Problem ist hier, dass die nicht synchron blinken - das heißt, wenn es viele Änderrungen sind, dass die komplett durcheinander blinken - das sieht nicht gerade professionell aus.

Kennt jemand diese Problematik? Wie könnte man dies lösen? Mir fällt da nix, zumindest bis jetzt, absolut nichts ein.

Ich hoffe, ich konnte die Problemstellung einigermaßen "rüberbringen".

Gruß und danke schon einmal für etwaige Antworten

22.06.2009 - 16:28 Uhr

Hallo "Kollegen",

ich bin jetzt seit ca. 9 Jahren in der Softwareentwicklung tätig und fange jetzt neu bei einer Firma an. Ich war schon bei Weltfirmen und 3-Mann-Klitschen, soz. alles mal durchgemacht. Meine Wanderjahre / Gesellenjahre sind nun vorbei und ich soll in der neuen Firma als Projektleiter anfangen. Weiterhin soll ich auch entwickeln, so ca. 50 Prozentaufteilung. Die Entwicklungsabteilung umfasst insgesamt (also mit mir) sieben Leute (also eher eine kleine Firma). Jetzt habe ich mich in der Vergangenheit ausschließlich mit Entwicklung befasst, so dass jetzt sehr viel Neues auf mich zukommt.

Ich habe da nicht gerade die Erfahrung, was ich auch so meinem neuen neuen Arbeitgeber vermittelt habe. Hat jemand für mich ein paar Ratschläge parat, wie man da am besten, natürlich neben "ins kalte Wasser geschmissen werden" reinkommt? - Links, Literatur ect.?

Mein letztes Pflichtenheft habe ich in der Ausbildung geschrieben und mein letzter Softwareentwurf ist auch schon Jahre her 😁

Danke schon mal für etwaige Antworten im Voraus.

Gruß

08.05.2009 - 23:59 Uhr

Vielen Dank für eure Anregungen, Tips und Hinweise.

Ich habe mich jetzt entschieden; folgende Domains gehören jetzt mir ... (zumindest solange ich bezahle natürlich 😉 ) ...

betpanorama.de
betpanorama.net
betpanorama.com
wettpanorama.de

Ist natürlich wie immer Geschmacksache ... leider war auch nach einmal Langenscheidt Longman English Dictionary nix gescheites mehr "auf dem Markt" ... alles total abgegrast. Panorama ist zwar "verdammt" lang, wird aber in allen drei Sprachen verstanden.

Case closed! 🙂

06.05.2009 - 13:53 Uhr

Hallo herbivore,

OK, sorry, habe ich jetzt falsch verstanden. Danke für die Ausführungen.

06.05.2009 - 13:40 Uhr

Hallo,

natürlich muss man mit Markenrechten aufpassen, aber bei Eindeutigkeit wird doch niemand ernsthaft eine Klage heraufbeschwören.

Wenn ich jetzt www.wettkaiser.de hernehme, die gibt es wirklich, die eine Krone im Logo hat und auf der Seite handelt es sich wirklich um Sportwetten - was soll da denn passieren? Franz Beckenbauer oder Her Kaiser von den Versicherungen kommt vorbei? So blöd ist doch kein Richter, zumindest denke ich das.

Bei z.B. www.betfair365.com sieht die Sache schon anders aus, das ist imo eine ganz klare Verletzung, da betfair absoluter Marktführer in Sachen Wettbörsen ist.

Also, ich denke schon, dass ich einen Namen verwenden kann, woraus ersichtlich ist, worum es sich handelt (nämlich um Sportwetten).

Btw, was da schon abgegrast wurde ist der Wahnsinn, die haben sich fast alle unter dem Nagel gerissen und warten, bis die teuer weiterverkauft werden können. Aktuelle Beispiele:

betmecca
betmaestro
betengine
betclick
betmeter
betlab

06.05.2009 - 11:31 Uhr

Hallo Nils,

yoursportbet ist auch schon weg 😉 ... (ich suche freie .com + .de + .net - Domains).

Am Anfang hat mir betpope auch gefallen, jedoch ist das schon ein bißchen anmaßend (obwohl das der Papst in Person ja auch ist 😄), denke ich. Auch mit den Rechten keine Ahnung, was da auf einen zukommen kann, man weiß ja nie und zu guter letzt ... ich persönlich habe mit der Kirche nix am Hut, deswegen würde das immer einen faden Beigeschmack haben.

Trotzdem danke für die Anregungen und Gruß von Hallstadt nach Bamberg rüber

06.05.2009 - 11:03 Uhr

Hallo Spontifixus,

danke für die Idee. Die Domains sind alle noch zu haben. Leider impliziert der Name etwas falsches, da wir (ich) ja keine Wetten abgeben 😉 ... ich hätte aber sofort bets4you genommen ... aber, wie fast immer, leider schon alle weg. 😜

Trotzdem vielen Dank für die Idee

06.05.2009 - 10:15 Uhr

Hallo "Kollegen",

ich suche aktuell einen schönen Namen für ein Portal, welches sich um Sportwetten, Analysen, Hintergrundinfos und (Quoten / Ergebnis) Statistiken von Sportereignissen (Fußball, Tennis ect.) handeln soll.

Im Namen der Domain muss bet(ting) vorhanden sein und es soll auch ein englischer Name sein (Portal soll später Deutsch, Englisch und Spanisch werden). Jetzt ist es ja so, dass da schon alles komplett abgegrast wurde. Ich habe gestern (und letztes Jahr auch schon mal) einige Zeit damit verbracht, aber an einem Tag bin ich nur auf ca. 30 Namen gekommen, die mich aber nicht befriedigen. Es gibt sog. Provider, die heißen dann Online-Gambling-Provider und bieten dann Domainen zum Kauf an, deshalb ist wirklich alles abgegrast. Ich bin jetzt halb durch mit meinem Englisch-Wörterbuch und da ist wirklich Ebbe ... Jedes "normale" Wort ist belegt, von spybet über findbet bis betnavigator.

Vielleicht hat der ein oder andere eine Idee hier, wäre wirklich toll.

Anbei die, die ich bis jetzt ausfiltern konnte. Sind nicht wirklich der Bringer, aber besser als nix. Würdet ihr da eine nehmen und warum?

betofficer
betshield
betsells
betquake
scanyourbet
betzombie
yummybets
yobets
xraybet(s)
betxray
wahoobet
betstrument
bettower
yezwebet
betassembler
kniggebet
betviking
betvenus
ufobet
bettrouper
betsteward
spotyourbet
betmarshal
betsheriff
greenyourbets
betcontroller
torpedobet
allofbets
betpolisher
betoperator
betnavel
betsupporter
betcouncil
betdeployer
betpope
betportrait
scoutyourbets
betquaker
road2bet(s)
betsurgeon
digyourbet
shockbet

Es handelt sich um mein privates Projekt, also nix kommerzielles. Danke euch schon mal für etwaige Antworten und Anregungen im Voraus.

05.05.2009 - 22:04 Uhr

Hiho, was unbedingt jeder mal gesehen haben muss ist
>
... der mit abstand beste Film der je in Bayern gedreht wurde!!! ...

LOL, da muss ich Dir Recht geben - der hat auch die 10 bei mir - der ist echt über die Jahre zum Kultfilm geworden - der war seiner Zeit 10 Jahre voraus, da hätte Herbig später einpacken können mit seinem Der Schuh des Manitu.
Dieser Film wird immer einen besonderen Platz in meinem Herzen haben, da ich in der Gegend, wo der Film gedreht worden ist, aufgewachsen bin. Wir durften den im Schulunterricht ansehen - ich kann mich noch erinnern, dass sogar unser Lehrer vor Lachen zusammengebrochen ist und auf dem Pausenhof haben dann alle Xaver-Slang gesprochen 😄

Mein Lieblingsfilm ist hier auch noch nicht genannt worden: **The Good, the Bad and the Ugly (Deutsch, Zwei Glorreiche Halunken) **von Sergio Leone ... der Film ist irgendwie so blöd, dass er schon wieder genial ist 😄 ... besonders die musikalischen "Einlagen" von Ennio Marricone (auch Koyotegeheul in der Titelmusik) sind unerreicht und wären heute unvorstellbar

Als Programmierer sollte einem auch der Film The 13th Floor mit Armin Müller Stahl gefallen haben - diesen Film jedenfalls habe ich eine Zeit lang nicht mehr aus dem Kopf bekommen, nachdem ich ihn gesehen hatte.

28.04.2009 - 18:46 Uhr

OK, ich habe auch zwei lustige Anekdoten

1.) Wir haben uns beim Testen immer mal wieder gewundert, warum der Server manchmal runterfährt ... später hat sich herausgestellt, dass einer in einer J2EE-Anwendung bei gewisser Bedingung System.Exit(0) zurückgegeben hatte 😁

2.) Code-Cleanup-Phase. Wir sollten in einer J2EE-Anwendung alle System.out.prints (also C# wäre Console.WriteLine) rausmachen aus der Applikation ... ein Kollege hat das zu ernst genommen und hat in den JSP-Seiten alle out.printlns rausgemacht 😁 ... nix mehr ging auf fast allen Seiten und wir wunderten uns, bis ich mit dem besagten eine Rauchen war, dann wurde schnell klar, dass es er war.

28.04.2009 - 18:38 Uhr

das is hammer 😉 da wollte einer ein Labyrinth bauen

Ach das nicht so wild, in meiner letzten Firma hat man bei VB nicht mal Einrückungen vorgenommen 😉

28.04.2009 - 14:56 Uhr

Hallo svenson,

vielen Dank für die Ausführungen, die meine Fragen beantwortet haben!

28.04.2009 - 12:44 Uhr

Hallo svenson,

danke, da habe ich doch mit log4j ein falsches Beispiel gewählt - sorry.

Frage bleibt aber die gleiche. Ist es ein Unterschied, wenn ich ein Produkt in der Firma einsetze oder verkaufe an andere Firmen oder läuft beides unter dem Begriff "kommerziell" ... das würde ja bedeuten, dass es bei starkem Copyleft keinen Sinn macht, fremde Libraries zu einzubinden, bzw. zu benutzen?

Gruß

28.04.2009 - 11:38 Uhr

Hallo "Kollegen",

ich hätte mal eine Frage bezüglich der GPL-Lizenz. Und zwar gibt es doch hier ein starkes und schwaches Copyleft. Meine Frage nun ist, ob es einen Unterschied gibt, zwischen dem Einsatz eines Produktes mit starkem Copyleft in der eigenen Firma und wenn man es verkauft.

Beispiel. Log4Net hat ein starkes Copyleft, das bedeutet, dass man im kommerziellen Einsatz (hier ist meine Frage, was bedeutet das) den kompletten Sourcecode auch veröffentlichen muss, bzw. lizenzieren lassen muss. Jetzt meine Frage. Es ist doch wohl ein Unterschied, ob ich im eigenen Unternehmen eine Software laufen lasse und hier z.B. mit log4net logge oder ob ich ein Produkt verkaufe, dass mit log4net logged. Liege ich da richtig?

Bei schwachen Copyleft (z.B. Hibernate) ist es ja eh wurst (auf mein Beispiel bezogen) ... natürlich nur, solange ich die Libraries "nur" einbinde und nicht verändere.

Eine Zusatzfrage. Wenn ich ein Produkt erweitere, ohne den Quellcode des Open Source-Produktes zu ändern (durch Ableitung), z.B. Neuerstellung eines Appenders bei log4net, wie fällt das denn dann unter die Lizenzbedingungen? Kennt sich da jemand aus oder kann einen Link posten?

Danke schon einmal für etwaige Antworten im Voraus.

28.04.2009 - 11:25 Uhr

Ich habe "damals" mit C/C++ meine "Programmierer-Karriere" begonnen. Ich hatte auch, das war 1998, sehr viel Meinungen eingeholt. Jeden gefragt, was ich lernen sollte. Da gabe es dann Vorschläge wie QBasic, da es am einfachsten wäre, Assembler oder gleich Maschienensprache war auch geboten worden und letztendlich C/C++.

Ich will hier ja niemanden zunahe treten, aber C/C++ ist und bleibt die heimliche Königin unter den Programmiersprachen. Mir hat man es eher abgeraten, da es eher nix für Anfänger sein sollte und einen Ruf hat, dass es sehr schwierig zu erlernen ist. Ich muss rückblickend sagen, dass mir nix besseres hätte passieren können. C/C++ (eher C++) ist die Basis für alle weiteren modernen Programmiersprachen, wie C#, Java oder VB. Basis meine ich, dass wenn man mal C/C++ beherrscht, der Umstieg nicht mehr so schwierig ist.

Also, wenn Du kompletter Neuling bist und unbedingt was lernen möchtest, dann lerne beides 😉 ... und ein Buch hast Du ja schon, warum soll das vergammeln? Und nochwas. Es gibt sehr gute C#-Open-Books online, z.B. Galileo C# Open Book

Also, viel Spaß beim Lernen und ich hoffe, dass ich Dir ein bißchen helfen konnte - letztendlich muss man sich natürlich selbst entscheiden.

Gruß

24.04.2009 - 23:06 Uhr

Halo Mazo,

wenn Du keine Möglichkeit hast, in Dein JavaScript eine Function, oder hidden Fields, einzubauen, dann musst Du die Function über C# selbst einbetten - es gibt leider keinen anderen Weg.

Um beispielsweise die Variable abzufragen, würde man so vorgehen:


// Header element holen, muss vorhanden sein!
HtmlElement header = this.webBrowser1.Document.GetElementsByTagName("head")[0];
// Neues element anlegen
HtmlElement script = this.webBrowser1.Document.CreateElement("script");
// Element nach script Element casten
IHTMLScriptElement scriptElement = (IHTMLScriptElement)script.DomElement;
// Scripting-Text schreiben, hier eine Function, die die Variable zurückgibt
scriptElement.text = "function getMyValue() { return localTime.toString(); }";
// Script-Element an Header-Element hinzufügen
header.AppendChild(script);
// Function aufrufen
Object myValue = this.webBrowser1.Document.InvokeScript("getMyValue");
// Wert ausgeben
MessageBox.Show(myValue.ToString());

Gruß und Microsoft.mshtml einbinden nicht vergessen

24.04.2009 - 17:30 Uhr

Indem Du eine Function aufrufst, die Dir die Variable zurückgibt 😉

21.04.2009 - 23:44 Uhr

Ich würde auch mal anraten den Sprung auf 3.5 nicht zu scheuen, Stichwörter XElement, XAttribute und XDocument

Ein Beispiel zum ändern eines vorandenen Elements wäre:


myMainNodeXElement.Descendants("Projekt-Nr.").First().Value = "Bla";

Der Vorteil ist halt hier auch, dass mittels LINQ to XML Abfragen durchgeführt werden können.

20.04.2009 - 15:53 Uhr

Automatisch sicherlich nicht. Möchtest Du
1.) die Datei (.cs) physikalisch auf der Platte haben oder
2.) mit dem Objekt sofort kommunizieren?

1.) Code-Generatoren manuell füttern (also XML auslesen und mappen), bzw. schreit das hier nach XSLT
2.) CodeDom

20.04.2009 - 12:53 Uhr

Hallo "Kollegen",

Erst mal folgender Beispielcode ...


public class App {

    static IList<String> lockList = new List<String>() { "Maus", "Monitor", "Notebook" };

    public static void Main() {
      new Thread(LockMethod).Start();
      new Thread(LockMethod).Start();
      new Thread(SomeOtherMethod).Start();
      Console.WriteLine("Done Main ...");
      Console.ReadLine();
    }

    public static void LockMethod() {
      Console.WriteLine("Enter LockMethod");

      lock(App.lockList) {
        Console.WriteLine("In lock block");
        App.lockList.Add("Software");
        Thread.Sleep(5000);
        App.lockList.Add("Hardware");
      }

      App.PrintList("LockMethod");
      Console.WriteLine("Exit LockMethod");
    }

    public static void SomeOtherMethod() {
      Console.WriteLine("Enter SomeOtherMethod");
      App.lockList.Add("Handy");
      Thread.Sleep(500);
      App.lockList.Add("Kabel");
      Thread.Sleep(500);
      App.lockList.Add("Schlüssel");
      App.PrintList("SomeOtherMethod");
      Console.WriteLine("Exit SomeOtherMethod");
    }

    public static void PrintList(String from) {
      Console.WriteLine(Environment.NewLine + "Print list for " + from);

      lock(App.lockList) {
        foreach(String item in App.lockList) {
          Console.WriteLine(item + " ");
        }
      }

      Console.WriteLine(Environment.NewLine);
    }
  }

Die Ausgabe sieht so aus:

[PRE]
Enter LockMethod
In lock block
Enter LockMethod
Enter SomeOtherMethod
Done Main ...

Print list for SomeOtherMethod
In lock block
Maus
Monitor
Notebook
Software
Handy
Kabel
Schlüssel
Hardware
Software
Hardware


Exit SomeOtherMethod

Print list for LockMethod
Maus
Monitor
Notebook
Software
Handy
Kabel
Schlüssel
Hardware
Software
Hardware


Exit LockMethod

Print list for LockMethod
Maus
Monitor
Notebook
Software
Handy
Kabel
Schlüssel
Hardware
Software
Hardware


Exit LockMethod
[/PRE]

Was ich jetzt nicht verstehe ist, warum ich in der Methode SomeOtherMethod die Liste verändern kann obwohl ich doch in einem Lock-Bereich die Liste "gesperrt" habe. Ist dieses Verhalten damit begründet, weil es sich um einen anderen Thread handelt?
Das lock-Schlüsselwort bewirkt ja, dass immer nur ein Thread in den Block reingeht, was in dem Beispiel ja auch funktioniert, nur dachte ich immer bisher, dass auch das Objekt (hier die Liste) als ganzes gesperrt wird, was aber nicht so ist. Warum sperre ich dann das Objekt, dann müsste doch auch folgendes gehen ...


lock {
  // Do some working
}

Warum muss man explizit ein Objekt sperren und kann nicht, wie z.B. in Java "einfach" nur einen synchronisierten Block (hier also lock ohne Objektangabe) definieren? Kann mich da jemand aufklären?

Vielen Dank für etwaige Antworten schon einaml im Voraus.

Gruß

11.04.2009 - 13:03 Uhr

Hallo herbivore,

naja, die Properties von der TimeZoneInfo-Klasse habe ich ja gepostet - da stehen leider nicht die Infos drin, die ich suche. Das Problem ist, wenn ich da jetzt manuell mit Regular Expressions drübergehe, dass natürlich diese Strings auch wiederum Sprachabhängig sind, da die TimeZone(Info)-Klasse(n) nicht sprachabhängig (CultureInfo) angefordert werden können.

Ich würde gerne an die verlinkten Bezeichnungen und Kürzel in den jeweiligen Klammern kommen - mir scheint, das ist auch mit Regular Expression für alle Sprachen unmöglich - wobei mir erst mal Englisch ausreichen würde. Da muss ich dann doch, wohl oder übel, das manuell selber machen. 🙁

Gewünschte Darstellung der Zeitzonen

11.04.2009 - 01:25 Uhr

Hallo "Kollegen",

gibt es eine Möglichkeit, von verschiedenen Zeitzonen die jeweiligen Abkürzungen, bzw. ausgeschriebenen Zeitzonen zu bekommen?

Nehmen wir Mitteleuropa. Ich würde gerne aus UTC+1, bzw. UTC+2 (Sommerzeit) CE(S)T (Englisch) oder ME(S)Z bekommen (oder auch ausgeschrieben, wie z.B. Central European Time oder Mitteleuropäische Zeit) ... leider bekomme ich das mit der TimezoneInfo-Klasse nicht hin - ich bekomme lediglich den String angezeigt, den auch Windows XP benutzt, das sieht dann z.B. so aus:


{(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna}
    BaseUtcOffset: {01:00:00}
    DaylightName: "W. Europe Daylight Time"
    DisplayName: "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna"
    Id: "W. Europe Standard Time"
    StandardName: "W. Europe Standard Time"
    SupportsDaylightSavingTime: true

Gibt es da wirklich kein Mapping? Muss ich da wirklich mit z.B. Regular Expressions drüber und z.B. bei Berlin auf MEZ (deutsch) und CET (Englisch) mappen?

Gruß und Danke schon einmal für etwaige Antworten im Voraus.

10.04.2009 - 17:01 Uhr

Hallo JuyJuka,

ich glaube, das ist nicht ganz richtig. Meines Wissens nach wird mit CurrentCulture nicht die Sprache des Betriebssystems abgefragt, sondern lediglich die Einstellungen unter "regionale Sprachoptionen, bzw. Regional and Language Options".

Somit bekomme ich natürlich DE, wenn ich die regionalen Einstellungen auf deutsch stelle, auch wenn ich ein englisches Betriebssystem installiert habe.

The default value of CultureInfo.CurrentCulture is determined by the regional options for the current user. This is configured using the Regional Options tab in the Regional and Language Options Control Panel applet. On my machine with XP installed I have about 160 different regions to choose from, from Afrikaans to Zulu. The default value of CurrentCulture corresponds to Win32 GetUserDefaultLCID.

The default value of CultureInfo.CurrentUICulture is determined by the configured UI language for the current user on an MUI version of Windows and the installed language for a localized version of Windows. The default corresponds to Win32 GetUserDefaultUILanguage. On a MUI version of Windows it is configured using the Languages tab of the Regional and Language Options applet.

There is also CultureInfo.InstalledUICulture. This is determined by the UI language for the installed version of Windows. It corresponds to Win32 GetSystemDefaultUILanguage.

Quelle

Ergo,

  1. CurrentCulture = Benutzerdefinierte Spracheinstellungen
  2. CurrentUICulture = Installiertes Language-Pack, bzw. 3, wenn ohne Language-Pack
  3. InstalledUICulture = Sprache installiertes Betriebssystem

Gruß

P.S. Hm, fehlt eigentlich noch die Sprache des installierten Frameworks, dann wären wir "komplett" - leider weiß ich das nicht

07.04.2009 - 02:17 Uhr

... wenn du attribute hättest, würdest du aufwändig suchen um nichts zu finden.

Hallo JAck30lena,

naja, wenn man das sowieso mittels Reflection macht, dann sollte man ja auch die Attribute Informationen pro Type cachen, so würde das aufwändige Abfragen der Attribute auch nur einmalig durchgeführt werden, so dass dies bezüglich Performance imo nicht ins Gewicht fällt.

06.04.2009 - 09:38 Uhr

Hallo @all,

ich möchte hier mal kurz etwas loswerden. Es ist nicht und niemals meine Absicht hier, jemand meine Arbeit machen zu lassen - das ist unter meiner Würde. Wenn ich offene Fragen habe, die sich auf ein Thema beziehen, wie eben hier in diesem Thread, dann notiere ich mir die immer und je nach Fragen stelle ich die auch schon mal in ein Forum ein. Nicht nur wegen möglicher Antworten, sondern um später auch mal eine Art Wiki zu haben und zu sehen, wie ich etwas implementiert habe oder wie es "damals" war.

Wenn ich jedoch den Eindruck vermitteln sollte, aufgrund von vielleicht vielen Fragen, wie hier im Thread, dass ich lediglich auf Antworten warte ohne dass ich mich zeitgleich auch aktiv (Bücher, Internet, MSDN) um die Antworten kümmere, der irrt sich gewaltig. Ich möchte das hier einfach nur klarstellen, so dass nicht der falsche Eindruck entsteht.

Es gibt öfter mal Threads, bei denen nur ich lediglich immer mal ein paar Kommentare hinzufüge, sozusagen nur einen Monolog führe, weil entweder keiner Antworten auf meine Fragen weiß, es zu trivial ansieht oder eben keine Lust hat zu Antworten. Lösungen poste ich dann auch abschließend, wenn ich die gefunden habe.

Ich finde dieses Forum eine Goldgrube und habe bisher auch mit niemanden hier Probleme gehabt - das möchte ich auch so in Zukunft belassen. Ich habe erst kürzlich angefangen (denn man braucht ja jahrelange Erfahrung) auch in Form von kleinen Projekten und Komponenten wieder etwas "zurückzugeben" - das wird in Zukunft noch viel mehr werden, da bin ich mir ganz sicher.

Ich bin hier im Forum für jede Antwort dankbar, ausdrücklich möchte ich mich stellvertretend hier für die letzte Antwort vom User kleines_eichhoernchen bedanken.

@herbivore, @Assri Komla,
sollte sich gestern einer vor den Kopf gestoßen gefühlt haben, dann möchte ich mich hier ausdrücklich entschuldigen. Mir ist einfach bei dem Posting von Assri Komla, soz. der "Schnürsenkel aufgesprungen" und ich ließ meinen Emotionen "ein bißchen" freien Lauf - das soll ja hin und wieder vorkommen.

Mag ja sein, dass es alles triviale Fragen sind, jedoch empfinde ich das nicht so, und bei meinen letzten beiden Arbeitgebern hätte nicht mal einer etwas mit dem Theam Threadpools anfangen können (OK, das ist auch mein Problem). Nichtsdestotrotz möchte ich noch abschließend darauf hinweisen, dass wir uns in einem Basics-Unterthread befinden.

So, das musste ich einfach mal loswerden.

06.04.2009 - 09:12 Uhr

Hallo Golo Roden,

danke für den Link. Ist ja eigentlich genau das Theama des Threads wobei man hier ggf. auch noch Attribute mit ins Spiel bringen könnte.

Da eine abstrakte Basisklasse für meinen Fall kein Hindernis ist (Stichwort Mehrfachvererbung), habe ich mich, wie oben schon angedeutet, für eine abstrakte Basisklasse mit abstrakten und virtuellen Methoden entschieden.

Die virtuellen Methoden geben halt Default-Werte zurück, wenn es überhaupt einen Rückgabewert gibt, ansonsten sind das halt nur leere Hüllen. Letzteres ist zwar nicht die optimale Lösung, da leere Methoden, aber der Einsatz von Attributen schien mir hier für meine Problem zu aufwändig.

Gruß und Danke noch an alle für die rege Teilnahme und den beschriebenen Lösungsvorschlägen.

05.04.2009 - 17:21 Uhr

Hallo herbivore,

das ist ja auch Dein gutes Recht. Ich bitte Dich aber nicht jedes Wort auf die Goldwage zu legen und bitte unterstellt mir jetzt nicht, dass ich keine Bücher lese oder MSDN und hier im Forum euch nur die Arbeit machen lassen möchte. Das ist ja schon fast eine Beleidigung. Aber gut, ich habe ja angefangen 😉

Gruß

05.04.2009 - 17:03 Uhr

Hallo Assri Komla,

wenn Du Dir die Fragen anschaust, dann sollte Dir schon klar sein, dass ich die gar nicht stellen könnte, wenn nicht vorher Bücher und MSDN gelesen wurden. Oder anders ausgedrückt. Wenn ich mir selbst auf alle meine vielen Fragen Antworten in Büchern und MSDN suche, dann bräuchte ich mittlerweile zwei Leben und hätte keine Zeit mehr arbeiten zu gehen. Desweiteren bräuchte ich kein Forum mehr (wo man auch hin und wieder Controls und kleine Utilities als Dankeschön zur Verfügung stellt) und müsste mich nicht mit unterqualifizierten Antworten rumärgern. Ich jedenfalls würde mein Wissen weitergeben, weil ich weiss, dass ich in dem Metier auf die Hilfe (Know-How von anderen) angewiesen bin. Wer würde denn heute noch als Softwareentwickler ohne Google, Foren oder Open Source überleben?

Gruß

05.04.2009 - 00:57 Uhr

Hallo dN!3L,

weil ich hier erst mal eure Meinungen hören wollte. Außerdem müsste ich ja n-verschiedene Attribute erstellen und dann noch eine umfangreiche Validierung (Rückgabewerte, Parameter ect.) durchführen.

Ich hatte zur Zeit der Threaderstellung mit Attributen "geliebäugelt", jedoch werde ich die Umsetzung mit einer abstrakten Klasse mit abstrakten und virtuellen Methoden vornehmen (dann sind halt die optionalen, virtuellen Methoden leer - man muss ja auch vorankommen 😄).

Vielen Dank noch mal für euere Hilfe und Anregungen - ich setze den Thread mal auf erledigt.

Gruß

05.04.2009 - 00:51 Uhr

Hallo dN!3L,

Gegenwärtig ist es so, dass alle asynchron laufen - das werde ich auch in das neue Framework so einbauen. Ich habe es bisher synchrones Ausführen nicht gebraucht, falls, dann kümmern sich die Jobs darum, bzw. laufen eben nur, wenn bestimmtes Ergebnis / Ereignis vorhanden ist / stattfand.

Könnte man aber locker mit einbauen, müsste man halt zwei Scheduler (asynchron / synchron) laufen lassen.

Trotzdem gute Idee für Erweiterungen, danke!

Gruß

05.04.2009 - 00:31 Uhr

Hallo JAck30lena,

naja, ich würde die ja nur dann aufrufen, wenn eine Implementierung vorhanden ist, bzw. wenn ein bestimmtes Attribute für eine Methode vorhanden ist. Somit ist sichergestellt, dass gewisse Arbeitsabläufe (Methodenaufrufe) durchgeführt werden können, wenn gewünscht, oder aber ausgelassen werden, falls nicht benötigt.

Bei den Untitests ist es ja z.B. auch so, dass es verschiedene Attribute gibt:

[ClassInitialize]
Einmalige Initialisierung innerhalb der Instanz (optional)

[ClassCleanUp]
Einmaliges Aufräumen innerhalb der Instanz (optional)

[TestInitialize]
Initialisierung vor Aufruf jeder Testmethode (optional)

[TestCleanup]
Aufräumen nach Aufruf jeder Testmethode (optional)

[TestMethod]
Die Testmethode (mandatory)

04.04.2009 - 23:33 Uhr

Hallo robert.wachtel,

stimmt, das wäre auch eine Möglichkeit, jedoch müsste ich dann, für alle optionalen Methoden (n) auch n-verschiedene Interfaces zur Verfügung stellen, die alle lediglich eine Methodensignatur enthalten.

04.04.2009 - 23:18 Uhr

Hallo dN!3L,

Warum führst du sie eigentlich asynchron aus?

Naja, es kann vorkommen, je nach Konfiguration, dass ein zeitkritischer Job zum Beispiel Arbeit für eine halbe Stunde hat (Abarbeitung pro Einheit in z.B. einer Sekunde) und dann ein anderer (ggf. auch zeitkritisch) vielleicht 5 Minuten, stehend vorher in der Queue, für die Abarbeitung benötigt, das würde bei einer synchronen Abarbeitung unter Umständen bedeuten, dass ein zeitkritischer Job fünf Minuten warten muss, bis er anfangen kann.

Bei dir müsste dann ja evtl. nochmal die Timerzeit geändert werden.

Ja, gegenwärtig habe ich vor, dass immer die Timerzeit nach den ersten Eintrag in der Queue, also auf die kürzeste Wartezeit, angepasst wird.

Gegenwärtig liest meiner in der App-Config alle Job-Deklarationen aus, das sieht dann so aus:


 <services>
      <service name="MMS orders matcher" class="OrdersMatchingService" prod.active="true" test.active="false" startOnHour="1" />
      <service name="MMS annulations matcher" class="AnnulationsMatchingService" prod.active="true" test.active="false" startOnHour="2" />
      <service name="MMS importer" class="MmsImporterService" prod.active="true" test.active="false" />
      <service name="MMS import sweeper" class="MmsImportSweeperService" prod.active="true" test.active="false" />
      <service name="Status data matcher" class="StatusMatchingService" prod.active="true" test.active="false" startOnHour="1" />
      <service name="UpToDate VNW notifier" class="VnwBuilderNotificationService" prod.active="true" test.active="false" />
      <service name="UpToDate VNW builder" class="VnwBuilderService" prod.active="true" test.active="false" />
      <service name="Legacy VNW builder" class="VnwBuilderServiceLegacy" prod.active="true" test.active="false" />
      <service name="Delivery mail importer" class="DeliveryMailImporterService" prod.active="true" test.active="false" />
      <service name="Delivery mail notifier" class="DeliveryNotificationService" prod.active="true" test.active="false" />
      <service name="TAT deployer" class="TatDeployerService" prod.active="true" test.active="false" />
      <service name="TOF deployer" class="TofDeployerService" prod.active="true" test.active="false" />
      <service name="UPS deployer" class="UpsDeployerService" prod.active="true" test.active="false" />
      <service name="UPS tracker" class="UpsTrackingReaderService" prod.active="false" test.active="true" />
    </services>

die werden dann mittels Reflektion gestartet. Unterstützt wird Mailing (Job-Reporting, Extern und Service-Mails, Benachrichtigunen), Logging (jetzt log4net), Auto-Exception-Handling bei Datenbank- und Netzwerkausfall, Message-Exchange, Handling für Konfigurationen, Auto-Serialisierung (und zurücksetzen beim Servicestart) von Job-Variablen

Remotingfähig werde ich den auch noch machen. Datenbank geht über meine NHibernate-Manger-Klasse

04.04.2009 - 22:06 Uhr

OK, vielen Dank erst mal für die Hinweise ... und ich dachte immer, what the heck with abstact classes, wenn es doch Interfaces gibt 😁


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestProject {
  public abstract class BaseTaks {
    public abstract void Run();

    public virtual void PreRun() {
      // Empty
    }

    public virtual void PostRun() {
      // Empty
    }
  }

  public class BlubTask : BaseTaks {
    public override void Run() {
      Console.WriteLine("I'm running");
    }

    public override void PostRun() {
      Console.WriteLine("Post runner");
    }

    public static void Main() {
      BlubTask blubTask = new BlubTask();
      blubTask.PreRun();
      blubTask.Run();
      blubTask.PostRun();

      Console.WriteLine("Done ...");
      Console.ReadLine();
    }
  }
}

Das wäre wirklich eine Lösung, was mir hier nur nicht gefällt, sind die leeren (non-mandatory) Methoden in der abstrakten Basisklasse.

Naja, jetzt muss ich mich wohl entscheiden ... Attribute wären ja auch eine Alternative, wie z.B. bei den UnitTesting-Klassen


//
    // You can use the following additional attributes as you write your tests:
    //
    // Use ClassInitialize to run code before running the first test in the class
    // [ClassInitialize()]
    // public static void MyClassInitialize(TestContext testContext) { }
    //
    // Use ClassCleanup to run code after all tests in a class have run
    // [ClassCleanup()]
    // public static void MyClassCleanup() { }
    //
    // Use TestInitialize to run code before running each test 
    // [TestInitialize()]
    // public void MyTestInitialize() { }
    //
    // Use TestCleanup to run code after each test has run
    // [TestCleanup()]
    // public void MyTestCleanup() { }
    //
    #endregion

    [TestMethod]
    public void TestMethod1(int Hallo) {
      Console.WriteLine("Hollo");
      Assert.AreEqual(1, 1);
    }

04.04.2009 - 21:14 Uhr

[EDIT=herbivore]Auf myCSharp.de gilt vom Grundsatz: "Nur ein Thema pro Thread" ([Hinweis] Wie poste ich richtig? Punkt 1.2). Diesen Thread hier habe ich nur ausnahmsweise stehen lassen, weil alle Fragen wenigstens ins gleiche Forum gehört und eine Aufteilung in diesem speziellen Fall noch unübersichtlicher wäre.[/EDIT]

Hallo "Kollegen",

ich habe ein paar Fragen bezüglich Threading.

  1. Kann man Prioritäten, wie bei "herkömmlichen Threads auch" bei Threadpool-Threads setzen?

  2. Wie lange wird in einem Thread die Ausführung durchgeführt, also wie lange bekommt ein Thread Zeit für die Abarbeitung, wenn alle Threads die gleiche Priorität haben? Kann man das steuern oder kann man sagen, dass jeder Thread für die Abarbeitung immer eine bestimmte Zeit, z.B. 100 Nanosekunden, beim Betriebssystem Windows XP ect. zugewiesen bekommt. Kann man das eventuell steuern oder einstellen?

  3. Verwendet man grundsätzlich bei einem Thread, der zyklisch "laufen", bzw. dauernd laufen soll immer einen Timer oder lasst ihr euch manchmal zu Thread.Sleep hinreissen?

  4. Benutzt ihr bei nicht Formsanwendungen (z.B. Consoleanwendung) den Formstimer, wenn ihr nicht sicherstellen könnt, dass die Ausführung der Timermethode länger dauert als das eingestellte Interval? Der "normale" System.Timers läuft ja immer im Interval, auch wenn die Methode noch nicht beendet ist. Eine Variable wäre hier imo eine schreckliche Lösung, dann kann ich ja gleich Thread.Sleep verwenden. Nimmt man dann also den Forms-Timer, obwohl es sich nicht um eine Formsanwendung handelt?

  5. Was passiert eigentlich rein technisch im Hintergrund, wenn ich ein Objekt destroye, welches eine asynchrone Methode (müsste technisch eigentlich Background-Thread sein) aufgerufen hat und diese noch nicht abgearbeitet wurde? ThreadAbortException? Irgendwo muss ich doch Aufräumarbeiten durchführen können.

  6. Was passiert eigentlich, wenn ein Timer läuft und in der Timer-Methode ein Objekt synchronisiert wird, z.B. lock, indem die komplette Abarbeitung dauerhaft länger dauert als das Timer-Interval? Werden dann die Anforderungen in eine Queue geschrieben?, so dass rein theoretisch der Timer stundenlang im "Rückstand" sein kann?

So, das war es auch schon wieder. Vielen Dank für eure Antworten schon einmal im Voraus - und nein, ihr müsst natürlich nicht jeden Punkt kommentieren.

Gruß

P.S. 7) Mir ist noch ein siebter Punkt eingefallen. Komme ich irgendwie an die Threads ran vor dem Aufruf (BeginInvoke?). Ich möchte z.B. eine einheitliche CultureInfo setzen.

04.04.2009 - 20:55 Uhr

Hallo herbivore, hallo zommi,

ihr habt mich auf eine Idee gebracht, mit der ich in Zukunft ruhig schlafen kann 😁 ... das Thema Thread.Sleep() ging mir eigentlich schon lange auf den Senkel und ich hatte keine Lösung gefunden. Nun ist mir etwas eingefallen - würde mich auf einen Kommentar freuen, wenn die Umsetzung dann doch nicht so gut sein sollte.

  1. Ich starte den Service, dieser startet den Controller in einem Thread.

  2. In diesem Controller gibt es einen kleinen Scheduler, dieser läuft als Timer

  3. Es gibt eine Queue, in der alle Teilservices hinterlegt sind, für die die nächste Startzeit vorliegen.

  4. Das Interval im (Scheduler) Timer ist so eingestellt, dass immer bis zum nächsten Teilservicestart "getickt" wird, also erstes Item in der Queue - somit werden Leerlaufzeiten vermieden.

  5. Nach jedem Aufruf der Run-Methode eines Teilservices wird der Eintrag aus der Queue entfernt

  6. Der Aufruf der Run-Methode wird als asynchroner Methodenaufruf durchgeführt (BeginInvoke)

  7. Nach dem Ende der Teilservice-Methode (Run) wird in der Callback-Methode (EndInvoke) abgefragt, wann nächster Start ist. Die Zeit wird dann in die Queue neu "reinsortiert"

8 ) Bei allen Teilservices besteht die Möglichkeit auch von selbst durch ein Event (z.B. Bestimmtes File im Filesystem oder Eintrag in Datenbank) nächstes Startevent im Scheduler anzumelden

Was haltet ihr von dieser Vorgehensweise? Ist das jetzt "sauber" umgesetzt? Leerlaufzeiten, um die ging es mir ja hauptsächlich, gibt es demnach nicht mehr und es werden Threads aus dem Threadpool (asynchrone Methodenaufrufe) verwendet.

Vielen Dank nochmal für eure Hilfe!

P.S. Was mir auch noch sehr wichtig war ist die Tatsache, dass ein Programmierer durch unsachgemäße handhabe des kleinen Frameworks, den Services als ganzes nicht mehr "runterziehen" kann. Vorher zum Beispiel, wenn er Thread.Sleep vergessen hätte, dann wäre der komplette Service auf über 50 Prozent CPU-Auslastung "geeiert". Jetzt müsste er das ja nicht mehr machen und eine Endlosschleife a la while(!AbortRequest) ist jetzt auch nicht mehr nötig.

04.04.2009 - 20:42 Uhr

Hallo "Kollegen",

wie teste ich eigentlich, neben Reflection wohlgemerkt, ob eine Methode den Anforderungen eines Attributes entspricht?

Beispielsweise gibt der Compiler beim TestMethod-Attribut einer Unittesting-Methode folgende Fehlermeldung zurück, wenn die Signatur nicht passt:

UTA007: Method TestMethod1 defined in class TestProject.UnitTest does not have correct signature. Test method marked with the [TestMethod] attribute must be non-static, public, does not return a value and should not take any parameter. for example: public void Test.Class1.Test().

Kann man die Signatur beim Aufbau des Attributes mit implementieren, oder muss man da einfach "Hand anlegen" und mittels klassischer Reflektion drübergucken?

Danke schon einmal für eure Antworten im Voraus.

Gruß

04.04.2009 - 20:38 Uhr

Hallo "Kollegen",

gibt es eigentlich Interfaces, bei denen man Methoden optional deklarieren kann? Mit optional meine ich, dass die Methoden nicht implementiert werden müssen.

Nehmen wir mal ein Beispiel-Interface einer Testklasse ...


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SemaphoreTest {
  interface ITest {
    public void Init();
    public void PreRun();
    public void Run();
    public void PostRun();
    public void CleanUp();
    public void RunRequestMonitor();
  }
}

Jetzt muss, und um das muss geht es mir, jede Klasse, die das Interface implementiert auch alle Methoden implementieren. Gibt es jetzt eine Möglichkeit, nur bestimmte Methoden als mandatory zu kennzeichnen? Es ist ja nicht gerade "dolle", wenn man leere Implementations-Methoden macht, nur damit sie halt "da sind".

OK, man könnte ja auch die "mandatory" im Interface lassen und für die restlichen Attribute verwenden.

Hat jemand noch, neben den Attributen, eine Idee?

03.04.2009 - 00:41 Uhr

Hallo "Kollegen",

ich zermartere mir für meine Problemstellung, die ich gleich nennen werde, schon länger den Kopf und finde einfach keine Lösung (vielleicht brauche ich ja auch keine und kann beim Thread.Sleep bleiben, who knows).
Es ist ja verpönt, Thread.Sleep zu verwenden, erst recht, wenn ein Code nichts macht, z.B. nächster Start in zwei Stunden und dann immer nach einer Sekunde schaut ob Arbeit vorhanden ist, dann läuft der natürlich die ganze Zeit "leer".
Ich habe auch den Microsoft Webcast zum Thema Multithreading angesehen und mir im Web näheres zum Thema Multithreading angeeignet. Nur für meine Problematik finde ich keine Lösung.

Erst mal zum Hintergund. Ich habe gegenwärtig einen Windows Service laufen, der nach dem Start einen Thread startet, die sogenannte Controller-Klasse. In dieser werden voneinander unabhängige Threads als Teilservices, konfiguriert in meinem kleinen Windows-Service-Framework, gestartet. Somit können eigenständige Module in den Service integriert werden.

Mir ist bewußt, dass es Programmierer gibt, die hier einen anderen Lösungsansatz verfolgen würden, z.B. eigenständige Programme gesteuert mit Scheduler, wie z.B. Quartz. Ich will aber beim Service bleiben.

Hier ein paar Beipiele für sog. Teilservices im Service.

a) Täglicher Abgleich von Datenbanken
b) Monatliches Erstellen von PDFs
c) Durchgehendes Importieren von Files
d) Informationsbeschaffung aus dem Internet von verschiedenen Seiten (stündlich)

Die Aufgaben hören sich natürlich Unterschiedlich an, gehören aber alle zum gleichen Projekt.

Im Taskmanager laufen gegenwärtig so um die 35 Threads. Die CPU-Auslastung wechselt beim Server, nennen wir die Kiste "Serverchen mit 3.5 GHz", von 0 auf 1 Prozent im Sekundentakt und wieder auf 0. Also keinerlei Performance-Probleme.

Nur wie kann ich das, technisch gesehen, richtig programmieren?

Alle Teilservices laufen in einer Endlosschleife, Endbedingung ist, wenn Flag gesetzt wird, z.B. beim Runterfahren des Services und natürlich am Ende der Schleife mit Thread.Sleep im Sekundentakt.

Wie gesagt, ich habe keinerlei Performanceprobleme, nur ein schlechtes Gewissen, weil das ja verpönt ist. Vielleicht kann mir ja doch einer den richtigen Hinweis geben, wie ich das umgehen kann.

Gruß und Danke schon einmal für etwaige Antworten im Voraus.

P.S. Timer sind imo nicht die Lösung, da Threads in Kontext mit meinem kleinen Windows-Service-Framework flexibler sind und Timer ja auch letztendlich Threads sind, die imo doch auch irgendwo eine Art Thread.Sleep implementiert haben müssen.

02.04.2009 - 23:57 Uhr

Archivierungsanpassung für RollingFileAppender

Ich habe den RollingFileAppender nach meinen Wünschen so angepasst, dass eine automatische Archivierung in Unterverzeichnissen nach einem Tageswechsel stattfindet. Gegenwärtig ist es ja so, dass im Logverzeichnis an das File nach einem Tageswechsel lediglich das Datum angehängt wird.
Diese Vorgehensweise habe ich auch angepasst. Es ist nämlich total nervig, wenn man z.B. das File LoggingTest.log.2019-02-28 nicht mit einem Doppelklick aufmachen kann. Ich habe das jetzt so angepasst, dass die Dateiendung auf .log bleibt, also das Datum reingebaut, nämlich LoggingTest-2019-02-28.log.

Archiviert wird folgendermaßen:

Es wird, wenn nicht vorhanden, ein Archivordner angelegt,
dann, wenn nötig, Jahresordner (yyyy),
dann, wenn nötig, Monatsordner (MM) - in diesen wird dann das archivierte File geschoben ...

Also, Struktur für obiges Beispiel:

|- Archiv
|- 2019
|- 02
|- LoggingTest-2019-02-28.log

log4net, RollingFileAppender, logging

Alles wurde mit 3.5 kompiliert

Gruß

01.04.2009 - 10:53 Uhr

Hallo "Kollegen",

ich habe mir das Buch Clean Code: A Handbook of Agile Software Craftsmanship "reingezogen" und fand es sehr hilfreich. Trotzdem werden in diesem Buch einige Standpunkte, bzw. Vorgehensweisen vertreten, die ich so nicht unterstützen kann. Diese möchte ich aufzählen und begründen.

Ich würde mich freuen, wenn ich von erfahrenen Entwicklern diesbezüglich ein kleines Feedback bekommen könnte, so dass ich ggf. meine Ansichten revidieren kann (oder muss).

  1. Rückgabe von Object, das nie null ist, sondern "leere" Instanz
    Beispiel:

public IList<String> GetList(bool bla) {
  List<String> back = new List<Sting>();

    if(bla) {
      // ... bla blub do something
   }
 
  return back;
}

Es wird ausdrücklich darauf hingewiesen, dass leere Instanzen erstellt werden sollen und keine Null-Referenzen.
Ich würde obigen Code nie so reinstellen, sondern null zurückgeben, wenn bla nicht true ist, und back würde ich mit null deklarieren.
Was spricht dagegen? Wird bei dieser Vorgehensweise nicht auch Speicherplatz gespart? OK, auf der anderen Seite muss natürlich immer auf null geprüft werden, nach dem Aufruf, das sollte aber imo immer der Fall sein, das setzt gute Programmierung voraus.

  1. Interfacenamen beginnen in einer Factory nicht mit dem "herkömmlichen" I, da es, so der Autor, der Benutzer nicht wissen muss ob es sich um ein Interface handelt, da dies ablenken könnte. Nun, ich benutze im Namen von Interfaces (ob Factory oder nicht) immer mit vorangestelltem I.

  2. Es werden bei einzeiligen Anweisungen, z.B. nach einer Schleife oder einer Bedingung keine Klammern gesetzt

Beispielcode:


  while(true)
    if(true)
      doSomething();
  if(true)
    doMore();

Ich finde das keinen schönen Stil. OK, ich muss mehr schreiben (Klammern), jedoch denke ich nicht, dass dies ins Gewicht fällt. Ich würde immer Klammern verwenden. Obiger Code würde dann so aussehen:


  while(true) {
    if(true) {
      doSomething();
    }
  }

  if(true) {
    doMore();
  }

  1. Wird ein Objekt übergeben (by Reference) und dieses manipuliert, dann soll dieses explizit zurückgegeben werden.

Beispielcode:


public StringBuffer ManipBuffer(StringBuffer inBuffer) { ...

Was spricht denn hier für diese Vorgehensweise? Ich bin hier folgendes gewohnt:


public void ManipBuffer(StringBuffer inBuffer) { ...

  1. Ein heikles Thema, Klammerung. Ich habe anfänglich die Klammerung auf gleicher Spaltenebene (also untereinander) gesetzt (und lieben gelernt). Dann kam ich auf ein Projekt, wo die Klammerung so verwendet wurde, dass die öffnende Klammer in der gleichen Zeile gesetzt wird. Ich habe das dann so verinnertlicht, dass ich bei dem übernächsten Projekt mir Klammern untereinander nicht mehr aneignen wollte - das bläht den Code nur auf und entgegen vielen Behauptungen ist der Code nicht übersichtlicher. Wie macht ihr die Klammerung und warum ... man kann ja Gott sei Dank mit eigenen Formattern die IDE so einstellen, dass die Klammern nach Wunsch gesetzt werden.

  2. Der Autor sagt, dass nicht immer ein einziges Return-Statement Sinn macht, z.B. bei kleinen überschaubaren Methoden,

Beispielcode:


public int GetCode(bool blub) {
  int ret = int.MinValue;

  if(blub) {
    return 1;
  }
  else {
    return 2;
  }  
}

Ich würde trotzdem immer nur einen Ausgang aus einer Methode bevorzugen, da bin ich konsequent.

  1. Zugriffe auf Variablen. Ich sehe immer wieder, dass "einfach nur" der Variablenname (ob nun Instanzvariable, Klassenvariable oder lokale Variable) - letzters macht ja Sinn, geht nicht anders, beim Zugriff verwendet wird.

Ich habe mir folgendes angewöhnt:

Bei Instanzvariablen immer den this oder base-Operator voranstellen, dann weiß man sofort, um welchen Typ (und wo sie beheimatet ist) es sich bei der Variablen handelt.

Bei Klassenvariablen schreibe ich immer die Klasse davor (auch wenn sich die Klassenvariablen in der gleichen Klasse befindet, um so eine Abgrenzung von lokalen Variablen sichtbar zu machen).

8.) Horizontale Ausrichtung

Ich sehe immer wieder folgende Variablendeklarationen:


private   Socket         socket;
protected String         output;
protected FitnessContext fitnessContext = null;

Das kann ja für den ein oder anderen übersichtlich aussehen, jedoch macht es bei Änderrungen einen großen Aufwand, wenn ein Variablenname länger ist als der bisher längste, denn dann müssen alle engepasst werden, somit bleibe ich bei folgenden Deklarationen:


private Socket socket;
protected String output;
protected FitnessContext fitnessContext = null;

  1. Mehrfachaufrufe in einer Zeile

Es wird empfohlen, aus folgendem Aufruf:


final String outputDir = ctx.getOptions().getScratchDir().getAbsolutePath();

folgenden zu machen:


Options opts = ctx.getOptions();
File scatchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();

Nun denke ich schon, dass dies Sinn macht, jedoch benutze ich erste Zeile immer dann, wenn ich auf jeden Fall weiß, dass es nicht krachen kann (NullReferenceException), dann kann man schon mal alles in eine Zeile packen.

  1. Komplexe Bedingungen sollten in eine Methode ausgelagert werden.

Beispielcode:


  if(!bla && gedoens && i > 5) { ...

soll ausgelagert werden zu ...


  public bool IsAccess(bla, gedoens, i) {
    return !bla && gedoens && i > 5;
  }

OK, die Parameter müssen natürlich nicht übergeben werden, wenn es sich um Instanzvariablen handelt, jedoch finde ich die Vorgehensweise nur dann Sinnvoll, wenn diese Abfrage öfters als einmal verwendet wirde - ansonsten würde ich hier keine neue Methode schreiben.

Unter dem Strich fand ich das Buch natürlich sehr hilfreich. (In der Regel kann man immer was von jemand lernen, der jahrzehntelang programmiert hat UND, jetzt kommt das Wichtige, einigermaßen mit der Zeit geht 😄)

OK, das war es erst mal. Aufruf an alle "Nitpicker" wird nun gestartet! 😉

Danke schon mal für die Teilnahme an der Diskussion im Voraus.

P.S. Ihr müsst natürlich nicht jeden Punkt kommentieren.

01.04.2009 - 02:27 Uhr

Hallo voidcore,

ich habe eigens für diese Problematik ein Console Logger Control entwickelt. Klickst Du >> hier <<

31.03.2009 - 23:23 Uhr

Hallo "Kollegen",

so auf die Schnelle habe ich jetzt im Web nichts gefunden. Ich habe ein Problem bei der Darstellung im Thunderbird, nachdem ich jetzt nur noch ein Konto habe (das alte bei einem Provider ist ausgelaufen). Früher war es immer so, dass der Inbox-Folder aktiv war, das beduetet, ich bin auf Get-Mails gegangen und in der Inbox wurden mir alle Mails angezeigt. Jetzt ist das so, dass ich immer explizit (also einmal pro Session) auf Inbox klicken muss, um alle Posteingänge sehen zu können - das ist total nervig. Eine Einstellungsmöglichkeit habe ich auch noch nicht gefunden. Kennt jemand dieses Problem und einen Lösungsansatz?

Danke schon mal für eure Hilfe im Voraus.

Gruß

27.03.2009 - 09:41 Uhr

Also ich hatte da noch nie Probleme beim Mappen. Auf den ersten Blick würde ich sagen, dass ich das XmlRoot-Attribute nur einmal bei einer Klasse verwende und bei den restlichen Klassen immer XmlElement.

Gruß

20.03.2009 - 12:02 Uhr

... in bayern gehen die sogar ncoh einen schritt weiter und nehmen grundsätzlich von jedem die kirchensteuer ein, welche man anschleißed wieder am jahresende bei der steuererklärung wieder zurückverlangen kann, vorrausgesetzt man ist aus der kirche ausgetreten. somit zahlen prinzipiell alle erstmal. unabhängig ihrer konfession.

ob sie das mittlerweile geändert haben weiß ich allerdings nciht. hier ist ja die CSU am regieren....

Nö, das ist definitiv nicht mehr so. Ich zahle in Bayern schon länger keine Kirchensteuer mehr ... und die Allmacht der CSU sollte ja mindestens seit der letzten Wahl (endlich auch) gebrochen sein.