Laden...

Forenbeiträge von Wolf_maYer Ingesamt 286 Beiträge

06.02.2009 - 12:54 Uhr

ThreadNamen sind implementiert.
Danke für den Hinweis!
Die Log ist wesentlich aufgeräumter!

Trotzdem bleibt meine Frage offen, da ich auf die Hex-Id trotzdem nicht verzichten möchte.

Grüße,
maYer

05.02.2009 - 16:15 Uhr

Das ist eigentlich auch eine feine Idee ...

Muss mal schauen, wie gut das machbar ist.

Sind schon ein paar Stellen 😃

05.02.2009 - 15:51 Uhr

hups, sry würde doch klappen.

Aber ist mir zu teuer, weil das ja für jede Log-Ausgabe gemacht werden müßte.

Und da jedes mal in Unmanaged Code zu hüpfen ... hmm, ne 😃

05.02.2009 - 15:49 Uhr

Hi kleines Eichhörnchen,

Die gibt aber leider für den Hauptthread 1 und den nächsten erstellten 2 usw. zurück.

Das entspricht nicht so ganz den in Visual Studio angezeigten ID´s

Grüße,
maYer

05.02.2009 - 15:20 Uhr

Ich habe mal weiter geschaut und folgendes gefunden:


string threadId = String.Format("{0:x8}", System.AppDomain.GetCurrentThreadId());

Leider ist die Methode veraltet. Kennt da jemand etwas neues?

Grüße,
maYer

05.02.2009 - 14:44 Uhr

Hi,
ich versuche gerade die aktuelle ThreadId in eine Log zu bekommen.
Hierbei mene ich nicht die ManagedThreadId aus System.Threadding sondern ich meine die hexadezimale Zahl, die in Visual Studio auftaucht, wenn man die Ausgabe verfolgt.

Weiß jemand, wo ich die abgreifen kan?

Grüße,
maYer

05.09.2008 - 16:47 Uhr

Was mir als erstes auffällt ist, dass du ruhig ein && anstelle des & machen kannst.

Damit wird bei einem false im ersten Teil der zweite nicht mehr ausgeführt.

<edit> ist zwar nicht eleganter aber schneller 🙂 </edit>

Grüße,
maYer

05.09.2008 - 13:52 Uhr

So wie sich mir das darstellt, reicht der Snapshot Modus für mich aus.
Ich habe allerdings als ich nach updlock gesucht habe auf dieser Seite gelesen, dass für die betroffenen Spalten ein Index existieren muss.

Nachdem ich den eingerichtet hatte, lief es einwandfrei.

Danke für deinen Tip! Ohne den hätte ich die Seite und die Info nicht gefunden.

Grüße,
maYer

05.09.2008 - 13:14 Uhr

Mache ich schon seit gestern Mittag 🙂
Manchmal habe ich den Eindruck, als wenn die MSDN einen zum "Buffer Overflow" zwingen möchte. Man Liest sooo viel und übersieht am Ende doch das wesentliche 🙂

Bin demnach schon dabei mir die Infos dazu zu holen.

Danke,

maYer

05.09.2008 - 13:04 Uhr

Super Idee icedre,
Danke, ich werde es mal einbauen.
Wie verhält es sich denn, wenn die Transaktion ein Rollback macht?

Werden die Einträge mid dem updlock in dem Fall auch berücksichtigt und wieder entfernt?

Grüße,
maYer

05.09.2008 - 12:59 Uhr

Like sollte es sein, wenn ich eine Wildcard benutze.
Da ich aber den genauen Namen weiß, kann ich auch = benutzen.

Grüße,
maYer

05.09.2008 - 12:48 Uhr

verwendetes Datenbanksystem: MSSQL 2005 Standard / Express / usw.

Hi Zusammen.
Ich habe hier eine mehr oder weniger mächtige DB Anwendung, die ich mit einem Lastentest durchgetestet habe. Hierbei habe ich einige Deadlocks gefunden und durch Änderungen im DB-Modell bereinigen können.

Hat alles wunderbar funktioniert. (Man kann ja im Voraus nicht an alles denken 🙂)

Nun stehe ich vor einem Problem, das ich nicht wirklich verstehe.

Tabelle:
Spalte1: ID - int - Autowert
Spalte2: Name - String
Spalte3: Info - String
Spalte3: Version - String
Spalte4: Datum - DateTime

Abläufe irgendwo in größeren Transaktionen:
Hinzufügen in Tabelle
Name = Name123
Info = Änderungen für Kunde X
Version = 04
Datum = 12.05.2007

Auslesen der Infos aller Versionen
Select * FROM Tabelle WHERE Name = 'Name123'

Das mache ich jetzt von mehreren Clients (natürlich mit unterschiedlichen Namen) und das Abfragen der Infos führt zu einem Deadlock.
"Die Transaktion befand sich auf Sperre Ressourcen aufgrund eines anderen Prozesses in einer Deadlock Situation und wurde als Deadlockopfer ausgewählt."

Was ich an dieser Stelle nicht verstehen kann ist, dass ich hier auf keinen Fall auf Zeilen zugreife, die in einer anderen Transaktion erstellt wurden! Die Namen sind zu 100% unterschiedlich!!!

Ich hoffe ich habe meinen Sachverhalt verständlich dar geboten!
Wenn noch Fragen offen sind, beantworte ich sie gerne.

Ach ja, ich arbeite mit der DB Einstellung: ALLOW_SNAPSHOT_ISOLATION ON" und der Session-Einstellung: "TRANSACTION ISOLATION LEVEL SNAPSHOT".

Viele Grüße und Danke an alle, die sich die Zeit nahmen sich das durch zu lesen,
maYer

20.06.2008 - 14:39 Uhr

Hallo FZelle,
danke für deinen Tip.
LinQ werde ich mir in der Tat in naher Zukunft anschauen.

Ich hatte aber den Eindruck, dass man damit nur Daten behandeln kann und nicht den Daten Container. Mein Ziel ist es die Tabellen zu erstellen und zu ändern und nicht deren Inhalte.

Ich benötige also etwas, dass mir anhand einer bestehenden und einer vorgegebenen Struktur die entsprechenden CREATE bzw. ALTER TABLE ausführt, Index und AutoInkrement anlegt etc.

Ist das damit möglich?

Grüße,
maYer

20.06.2008 - 13:59 Uhr

Hmm,
ich dachte mir soetwas schon.

Dann fange ich mal an und baue mir sowas ...

grmml 😉

Grüße und vielen Dank,
maYer

20.06.2008 - 13:27 Uhr

verwendetes Datenbanksystem: MSSQL 2005

Hi,
ich möchte gerne eine Art Data Model Designer erstellen.
Zumindest ein paar Basisklassen, mittels denen ich eine Tabelle anlegen oder anpassen kann.

Hierbei würde ich mich gerne mal konkret mit den im Namespace System.Data vorhandenen Klassen auseinander setzen.

Ist es möglich, dass ich eine DataTable im C# Code erstelle und diese einer Datenbank zuweise und diese Tabelle in der DB angelegt oder angepasst wird?

Wenn das zu ungenau ist, dann gehe ich gerne näher darauf ein, was ich meine.

Grüße,
maYer

13.06.2008 - 14:59 Uhr

Hallo riCo,
das kann ich gerne machen.
Ich habe zum Beispiel die Operationen "Auftrag erstellen" und "neuen Auftrag von Auftrag ableiten".
Jetzt sind an diesen Auftrag Positionen gekoppelt, die wiederum aus weiteren Positionen bestehen. Ich habe also einen mehr oder weniger komplexen Baum, den ich komplett durchlaufen muss.

Um sicher zu gehen, dass ich in einem Fehlerfall keine halben Aufträge im System habe, habe ich die komplette Operation durch eine Transaktion abgesichert.
So viel zum Vorgang.

Die Testaplikation sollte nun mehrere Benutzer gleichzeitig simmulieren, und damit eine parallele Abarbeitung der Operationen durchführen. Damit kommt es zwangsweise zu dem Fall, dass sich zwei simmulierte Benutzer gleichzeitig innerhalb einer Transaktion befinden.
Ich darf aber pro Prozess und Connection nur eine Transaktion offen halten.

Leider (dass muss ich dazu sagen) ist die Session/Connection statisch gehalten und ich kann nicht mal ebend flux eine zweite öffnen. Ist ein Design Problem, dass ich noch angehen muss, wofür ich aber im Moment keine Zeit habe.

Grüße,
maYer

12.06.2008 - 14:59 Uhr

Hi,
um den Standard-Text zu füllen: Ich arbeite mit der MSSQL 2005 Expr. und Std.

Nun zu meinem Problem.
Ich habe hier eine Applikation, die für mehrere User ausgelegt ist. Das bedeutet, dass es mehrere Clients gibt, die auf die Datenbank zugreifen und ihre Daten über die DB teilen.
Die Operationen, die mit den Daten durchgeführt werden, dauern unter Umständen mal etwas länger. Etwas länger dauert so ca. 5 - 10 Minuten und sind unter Umständen durch eine Transaktion abgesichert.

Nun sind bei manchen Nutzern Probleme aufgetreten, die ich zu Hause mit einer Testapplikation nachvollziehen möchte ohne dass ich hierfür zahlreiche PC´s benötige. (Ich bin noch bei der Planung des Testprogramms und habe fast keinen Code geschrieben!!!)

Meine Idee an dieser Stelle war/ist es, eine Testapplikation zu erstellen, die das Verhalten mehrerer Nutzer simuliert. Anhand der Systemressourcen möchte ich beeinflussen können, wie viele User auf einem PC simuliert werden.

Also den Ablauf der DB Operationen in eine Klasse und die Hauptmethode mehrfach mit einem neuen Thread aufrufen.

Kling erstmal gut finde ich.
Mein Problem an dieser Stelle ist, dass einige Operationen innerhalb einer Transaktion gekapselt sind. Jetzt darf ich aber nur eine Transaktion innerhalb eines Prozesses aufrufen. Diese Fehlermeldung habe ich zumindest ein paar mal gesehen.

Wie kann ich dieses Problem umgehen? Hat jemand dort eine Idee?
Meine Idee war jetzt, dass die Abarbeitung in eine eigene Applikation schiebe, die mich mit Startparametern aufrufe. Leider kann ich dann so schlecht gesammelte Informationen an die Steuernde Applikation senden und muss eine komplexe IPC implementierung vornehmen, was die Zeit eigentlich nicht her gibt.

Danke für Eure Hilfe, Infos und Unterstützung,
maYer

04.06.2008 - 18:06 Uhr

Hi,
ich habe an dieser Stelle einen Freeware Obfuscator gepostet. Was haltet ihr von dem Tool?

Ich habe folgendes getestet.
Mehrere dll´s mit den standard Einstellungen durch das Tool geschleust und auf Funktionalität getestet. --> Lief 😉

Mit dem Reflektor die Dll´s angeschaut. --> Bin auf mehrere Fehlermeldungen gelaufen und konnte keinen richtigen Nährwet aus den Informationen ziehen.
Mit einer Trial Version von Spice auf die Bibliotheken geschaut. --> Jetzt kann ich nicht sagen, ob es daran lag, dass ich nur eine Trial Version hatte aber ich konnte auch nicht wirklich viel aus den Dll´s erkennen.

Ich finde den Schutz nach den Tests ausreichend aber mich würde interessieren, wo ihr eventuelle Schwachstellen seht.

Grüße, maYer

04.06.2008 - 13:10 Uhr

Hi,
ich habe seit kurzem einen Freeware Obfuscator gefunden.

Phoenix Protector

Ich habe ihn getestet und bin sehr zufrieden mit ihm.

Grüße,
maYer

13.03.2008 - 22:20 Uhr

Hallo zusammen,
ich habe ein kleines Problem, bei dem ich nicht mehr weiter weiß.
Es geht dabei um ein Remote Object, das ich versuche aufzubauen.

Es funktioniert im Debug-Modus, es funktioniert, im Release-Modus, wenn ich es aus der VS-Umgebung starte.
Aber es funktioniert nicht, wenn ich es im Release Modus ohne VS-Umgebung starte.
Die Ausnahme, die ich bekomme lautet: Der Typeninitialisierer für NameSpace.Klasse hat eine Ausnahme verursacht.

Aus früheren Implementierungen weiß ich, dass man es tunlichst vermeiden soll, das Remote-Objekt in einer statischen Methode oder einer statischen Klasse aufzubauen.

Ich habe es nach einigem hin und her nun direkt im Mainform implementiert. Nix statisch, nix irgendwas. Ich versuche jetzt noch einmal einen BG-Worker damit zu beschäftigen, damit es nicht im GUI-Thread passiert. Aber ansonsten fehlt mir wirklich die Fantasie, an was es noch liegen könnte.

Vielleicht fällt Euch ja noch etwas ein, an das man beim Aufbau vom RemoteObjekten denken sollte.

MFG;
maYer

08.02.2008 - 18:08 Uhr

Werde es gleich mal machen 😉

Danke

08.02.2008 - 16:29 Uhr

Hi svenson,
ich habe da gerade auf dem Blog geschaut und nichts gefunden über das ich automatisch auf die Beta-Tester-Liste komme.
Kann es sein, dass ich erst mit Wesner Moise kommunizieren muss, und er mich handisch auf die Liste setzt?

Grüße,
maYer

08.02.2008 - 11:52 Uhr

grummel,
reSharper kann ich gerade nicht testen, da ich das SP1 für VS2005 nicht installiert habe.
Die FlashDemo schaut aber schon sehr gut aus und ich werde mal versuchen durch zu drücken, dass wir SP1 installieren.

Ich kann es nur nicht selber entscheiden.

Grüße,
maYer

08.02.2008 - 11:27 Uhr

Hi,
ich habe mir NCover mal angeschaut.
Klasse Programm, wenn man einen schönen BlackBox-Test machen möchte um zu schauen, welche Codezeilen in dem Test genutzt werden.

Ich verfolge eher den theoretischen Ansatz.
Also ich möchte nicht herausfinden welcher Code nicht genutzt wird sondern ich möchte herausfinden, welcher Code nicht genutzt werden kann 😉

Dabei setze ich natürlich voraus, dass kein Code über Reflection genutzt wird.

Geht das mit NCover auch oder kennt jemand ein Tool, was das kann?

Grüße,
maYer

p.s. resharper schaue ich mir auch mal an 😉

07.02.2008 - 15:23 Uhr

Hi,
kennt jemand ein Tool, mit dem man nach nicht mehr verwendeten Code suchen kann? Oder gibt es die Möglichkeit schon in VS und ich kenne sie nicht?

Ich mache es im Moment so, dass ich die Solution öffne und bei Methoden, bei der ich den Verdacht habe, dass sie nicht mehr verwendet wird, über das Kontextmenu nach allen Verweisen suche.

Es wäre super, wenn man das irgendwie komfotabler lösen könnte 😉

Grüße,
maYer

08.01.2008 - 11:36 Uhr

Danke herbivore,

ich werde mich dort einmal einlesen und dann eventuell noch offene Fragen in einem neuen Post stellen.

Nach dem, was ich bis lang gelesen habe glaube ich aber, dass die Suche dabei ausreicht 😉

Gruß,
maYer

08.01.2008 - 09:31 Uhr

Hallo Zusammen,
ich möchte ein Sammlerprogramm erstellen, welches aus verschiedenen "eigenen" Applikationen Informationen sammelt.

Funktionell habe ich mir folgendes überlegt:
Programm X ist das Sammlerprogramm und A - D sind die eigenen Applikationen.

Als erstes möchte Programm A etwas an X senden. A schaut nach, ob Programm X gestartet ist. Wenn das nicht der Fall ist, dann wird das Programm X von A gestartet. Anschließend wird die Information an X gesendet.

Eine bidirektionale Kommunikation ist nicht notwendig.

Soweit zu meinen Vorstellungen. 😉

Nun zu meiner Frage:
Wie löse ich das?

Hehe, ich weiß, dass ihr so allgemeine Fragen liebt aber mir fehlen noch die Schlagworte (Technologien), nach denen ich schauen muss um spezielleren fragen stellen zu können.

Ich bin Euch also dankbar um ein paar Tips - Vorschläge worein ich mich einlesen kann um meine Planun zu verfeinern.

Grüße,
maYer

29.11.2007 - 10:25 Uhr

Sooo,
das war eine sehr schnelle und überstürzte Antwort. 😉

Zu meiner Applikation kann ich sagen, dass ich eigentlich schon recht genau getrennt habe.

Als unterste Schicht habe ich eine Connection, die auf das Inteface System.Data.IDbConnection implementiert hat um flexibel zu bleiben.
Leider habe ich in der darüber liegenden Schicht nicht so zu 100% getrennt 🙁

Da wird jetzt glaube ich ein bisschen Arbeit auf mich zukommen.

Da das DB-Modell nicht statisch ist, möchte ich an der Struktur nicht mehr so viel ändern. Es funktioniert sehr gut und es arbeiten schon einige Applikationen mit der Data-API.

man man man.

Das wird ein langes Wochenende 😉

Wenn jemand eine Idee hat, was ich auf jeden Fall bedenken muss oder was ich für einen Ansatz verfolgen könnte.
Nur her damit 😉

Gruß, maYer

29.11.2007 - 09:16 Uhr

Original von FZelle
Wieso selber machen?

Solche DAL's gibt es wie sand am mehr.

Sehr spannend,

Wo finde ich die? Wie finde ich die? Und wieso kenne ich die noch nicht? 😉

Unter DAL finde ich nichts und zu viel. Bzw. kannst du das vll ein bisschen spezifizieren?

Gruß, maYer

28.11.2007 - 15:47 Uhr

Ja klar.

Hier mal zur Verdeutlichung eine kleine xsd Datei:


<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<!-- Element Definitionen -->
	<xs:element name="ID" type="xs:integer" />
	<xs:element name="Typ" type="enumMessageType" />
	<xs:element name="Text" type="xs:string" />
	<xs:element name="LogText" type="xs:string" />
	<!-- Enumerationen -->
	<xs:simpleType name="enumMessageType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Warnung" />
			<xs:enumeration value="Fehler" />
			<xs:enumeration value="Info" />
			<xs:enumeration value="Hinweis" />
			<xs:enumeration value="Frage" />
		</xs:restriction>
	</xs:simpleType>
	<!-- Struktur Definition -->
	<!-- Root -->
	<xs:element name="MsgRoot">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Message" type="MessageType" minOccurs="0" maxOccurs="unbounded">
				</xs:element>
			</xs:sequence>
		</xs:complexType>
		<!--Eindeutigkeits-Definition-->
		<xs:unique name="MsgID">
			<xs:selector xpath="Message" />
			<xs:field xpath="ID" />
		</xs:unique>
	</xs:element>
	<xs:complexType name="MessageType">
		<xs:sequence>
			<xs:element ref="ID" />
			<xs:element ref="Typ" />
			<xs:element ref="Text" />
			<xs:element ref="LogText" />
		</xs:sequence>
	</xs:complexType>
</xs:schema>

Der ComplexType MessageType wird unten definiert und oben benutzt.
Zusätzlich habe ich oben eine Enumeration für den Messagetyp eingebunden und unten eine Eindeutigkeitsbeschränkung auf das Element ID gelegt.

Der MessageType ist allerdings auch wieder weiter schachtelbar 🙂

Ich hoffe, es hilft dir.

Gruß, maYer

28.11.2007 - 13:46 Uhr

-Bestimmte Einträge zu suchen und dann anhand eines Kriteriums zu löschen?

Naja, es ist nicht möglich nur den bestimmten Teil zu öffnen aber mit xPath ist es möglich bestimmte Knoten zu finden und dementsprechend auch zu eliminieren.

Gruß, maYer

28.11.2007 - 13:05 Uhr

Hmm, ok
Wenn ich das richtig verstehe, dann muß mein Mechanismus dahin gehen, dass immer eine neue Verbindung aufgebaut wird es sei denn ich habe eine aktive Transaktion.

In dem Transaktionsfall muss ich schauen, ob dies der selbe Thread ist. Wenn es nicht der Fall ist, dann muss ich doch eine neue Connection aufbauen und an die Transaktion binden und wenn es der selbe Thread ist, muss ich .... hmm

Verdammter Mist 😉
Wo merke ich mir was und wie bringe ich da einen Automatismus rein...

Ich muss das mal sacken lassen und in mich gehen.

Danke aber nochmals für die Infos.

Hoffentlich habe ich Anfang des Jahres mal die Zeit das komplett zu implementieren.

Gruß, maYer

28.11.2007 - 12:33 Uhr

Bei jeder noch so kleinen Abfrage eine neue Connection aufbauen?

Wenn ich ehrlich bin sträuben sich da bei mir ein paar kleine Nackenhaare.

Gruß, maYer

28.11.2007 - 12:31 Uhr

Jede XML-Datei hat immer genau einen RootNode.
Das steht so in den Spezifikationen.

Wenn du das Dokument geöffnet und zurück bekommen hast, kannst du über die XMLNode Klasse neue Knoten hinzufügen, alle durchlaufen, welche löschen oder ändern, mit XPath drüber suchen etc. Fuchs dich mal ein, es wird dir gefallen.

Gruß, maYer

28.11.2007 - 12:07 Uhr

Hi,

ich weiß nicht, ob das jetzt gut passt aber ich gehe einen anderen Weg um eine neue XML-Datei zu erstellen.

Hier sind meine Beispiel-Funktionen:

Dokument neu erstellen:

private void BuildNewXML(string Path, string RootNodeName)
        {
            XmlDocument Doc = new XmlDocument();
            Doc.CreateXmlDeclaration("1.0", "utf-8","yes");
            XmlNode xRoot = Doc.CreateElement(RootNodeName);
            Doc.AppendChild(xRoot);
            Doc.Save(Path);
        }

Dokument öffnen:

private XmlDocument LoadXml(string XMLPath)
        {
           
            if (!System.IO.File.Exists(XMLPath))
            {
                BuildNewXML(XMLPath, "ROOT");
            }
            
            try
            {
               
                XmlDocument Doc = new XmlDocument();
                Doc.LoadXml(XMLPath);
                
                return Doc;
            }
            catch (Exception e)
            {
                
            }
        }

Anschließend kannst du auf dem XML-Document alles machen, was du möchtest und anschließend wieder speichern.

Gruß, maYer

28.11.2007 - 11:54 Uhr

Schande auf mein Haupt!!!

Wenn ich die DB-Schicht nochmal schreiben könnte, dann würde ich eine globale Verbindung für lesende Zugriffe definieren und für jede Transaktion Zugriff eine neue temporäre Connection aufbauen.

Dann sollte ich keine Probleme mehr damit bekommen.

Aber die liebe Zeit macht mir das Leben an dieser Stelle im Moment das Leben schwer.

Gruß, maYer

28.11.2007 - 09:56 Uhr

grummel,
so etwas habe ich schon befürchtet.

Ich habe die Connection leider recht Global verwaltet und gut gekapselt, damit ich damit nicht mehr so viel zu tun habe.

Jetzt muss ich mal schauen, wie ich das umdesigne, damit das möglich ist 🙁

Ach ja, mein DBS ist der MSSQL Server 2005/2005 EXPRESS
Damit sollte das schon möglich sein.

@JuyJuka Danke für das Angebot aber ich glaube, dass ich das hinbekomme.

Danke für Eure Antworten,

maYer

27.11.2007 - 16:21 Uhr

Hallo zusammen,
ich habe eine kleine (ich glaube Design-) Frage. 😉

Folgendes Scenario möchte ich erstellen.

Ein Serverdienst wartet auf eine Anfrage und schiebt sie in eine Queue.
Die Queue wird in einem eigenen Thread abgearbeitet und die einzelnen Jobs können mal länger dauern. (Deswegen ja auch Server-Dienst)
Unter anderem benutze ich bei der abarbeitung der Jobs eine Transaktion auf der Datenbank.

Nachdem der Job in der Queue abgearbeitet wurde, wird er in eine neue Warteschlange geworfen. Diese Warteschlange wird anhand eines Timers abgearbeitet, der alle 5 Minuten in einer bestimmten Tabelle einer Framdanwendung nachschaut, ob die Informationen für diesen Job vorhanden sind.
Ist dies der Fall, dann muss dieser Thread ebenfalls eine DB-Transaktion durchführen.

Es kann also durchaus vorkommen, dass ich zeitgleich 2 Transaktionen auf die Datenbank losschicken möchte. Ich habe die Erfahrung gemacht, dass ich in einer Applikation nur eine Transaktion zur selben Zeit ausführen darf.

Wie Synchronisiere ich die Vorgänge jetzt am besten?

Danke für Eure Hilfen.
maYer

18.11.2007 - 13:12 Uhr

Hallo,
irgendwie verstehe ich die ganze Aufregung nicht.
Ich bin auch ein "Anfänger" (naja ein bisschen fortgeschrittener aber trotzdem noch lange nicht mit dem KnowHow, den andere hier an den Tag legen) und ich ich bin froh, dass wenn ich ein Problem habe, welches ich nicht genau spezifizieren kann hier ein Stichwort gesagt bekomme, mit dem ich in der Suche zu einem Ergebnis komme.
Das ist doch der Sinn und Zweck des Forums.

Ich möchte gar kein Code-Beispiel sondern Stichpunkte, mit denen ich mir das Thema, welches ich gerade neu benötige, einarbeiten kann.

Und das ist in vielen anderen Posts hier auch der Fall.
Damit sollte keiner verjagt werden aber es sollten alle in der Lage sein auch offline zu programmieren, wenn nichts anderes als die MSDN zur Verfügung steht. Lesen bildet. Das muß man auch den kleinsten Anfängern beibringen.

Und jetzt genießt den Sonntag. Es scheint die Sonne!!!
Geht raus, genießt die Luft und lasst die Arbeit Arbeit sein 😉

Gruß,
maYer

26.10.2007 - 10:32 Uhr

Dann ist das hier:

Original von JuyJuka
A) IFile implementiert File

ein klassischer Verschreiber ...

Verstehe verstehe ... kein Wunder, dass ich dabei immer verwirrter werde 😉

Danke herbivore

Gruß, maYer

26.10.2007 - 09:39 Uhr

Hi JuyJuka,
danke für die Erklärung.
So in etwa habe ich das auch gemeint. 😉
Ich komme noch mit den Begrifflichkeiten bei Interfaces durcheinander.
Irgendwie finde ich es noch unlogisch, dass das Interface die Klasse Implementiert, da die Methode ja in der Klasse sind.

Aber verstanden habe ich das Konzept trotz alledem schon.

Ich versuche mal mein Glück, das Pattern zu implementieren.

Gruß, maYer

25.10.2007 - 16:56 Uhr

Hmm,
schaut sehr gut aus.
Da ich UML nicht so gut interpretieren kann, mache ich es hier mal öffentlich, damit Ihr mich korrigieren könnt, falls ich etwas falsch mache 🙂

Der Pfeil von File nach IFile bedeutet, dass File das Interface IFile implementiert hat,
die gestrichelte Linie zeigt an, welche Methode dort geschrieben wurde
und der zentrale Pfeil... Joa, da müßte ich jetzt raten.
Bedeutet er, dass an dieser Stelle anhand bestimmter Parameter entschieden wird, welche Strategie des Speicherns genommen wird?

Gruß, maYer

25.10.2007 - 16:25 Uhr

Hi,
danke für die Antwort.
Leider habe ich gemerkt, dass meine Klassenhierarchie so nicht stimmt.

Jetzt habe ich gedanklich aus dem bestehenden:
iFile
baseFile : iFile
transactionFile : baseFile, iFile
cryptFile : transactionFile, iFile

folgendes gebaut:
iFile
baseFile : iFile
cryptFile : iFile
transactionFile : baseFile, cryptFile, iFile

Wobei das auch so nicht ganz stimmt.
Ich möchte gerne, dass transactionFile entweder von base oder von crypt erbt. Von beiden geht ja sowieso nicht.
Gibt es dafür auch ein entsprechendes Pattern, was das abdeckt?

Gruß, maYer

25.10.2007 - 11:33 Uhr

Hi,
ich habe mal die Frage, ob das, was ich mir vorstelle so funktionieren kann.

Ich habe auf Dateiebene eine Transaktion implementiert, die soweit auch wunderbar funktioniert. dafür habe ich eine Klasse geschrieben, die die IO-Klasse des Frameworks kapselt.

Nun kommt die Anforderung, dass bestimmte Dateien verschlüsselt werden müssen. Das geschieht allerdings nur, wenn ein bestimmtes SnapIn auf dem Client vorliegt. Die Transaktionen sollen in dem Fall aber auch weiterhin funktionieren.

Um das zu realisieren habe ich mir folgendes überlegt.
Ich erstelle 3 Klassen und ein Interface.
iFile
baseFile : iFile
transactionFile : baseFile, iFile
cryptFile : transactionFile, iFile

Der komplette Zugriff geht damit über das Interface.

So weit so schön 🙂

Leider habe ich keine Ahung, wie ich die Initialisierung implementieren soll, so dass das richtige Objekt instanziert wird.
Ich stelle mir das so vor, dass ich einen Konstruktor mit zwei Parametern implementiere.
Ein Objekt vom Typ CryptSnapIn und einen Boolschen Parameter useTransaction.
Wenn das CryptSnapIn null ist, dann verwende ich schon einmal nicht die Cryptklasse. Wenn zusätzlich noch useTransaction false ist, dann instanziere ich ein baseFile - Objekt.

Ich hoffe, dass es recht verständlich gewesen ist.
Wenn trotzdem noch Fragen offen sind, beantworte ich sie gerne.

MfG,
maYer

18.10.2007 - 10:34 Uhr

Hi ikaros,
Danke für deine Doku.

Besonders der Tip, dass das Pattern unwirksam ist war hilfreich.

Ich werde es jetzt auf folgendem Wege versuchen:

public sealed class QueryManager : MarshalByRefObject, Idisposable
{
      public static readonly QueryManager Instance = new QueryManager();      
      ...

      private QueryManager() {}
}

Gruß, maYer

17.10.2007 - 14:10 Uhr

Hi ikaros,
danke für deine Antwort.

Laut MSDN kann ein Thread-Safe Singleton-Objekt mit Hilfe der Double-Check Locking Methode implementiert werden.
Diese habe ich in meinem Projekt übernommen. Kann man sich beim .NET Remoting auf solche Vorgehensweise verlassen, um ein Thread-Safe Singleton Objekt zu erzeugen, oder gibt es andere Wege, dieses Problem zu bewältigen.

Hier steht noch, dass man diesbezüglich auch die Lebensdauer des Singleton-Objekts immer auf unendlich setzen soll. Das habe ich bei mir so nicht implementiert. Kann das mein Problem sein?


public override object InitializeLifetimeService()

{

return null;

}

Gruß, maYer

17.10.2007 - 11:11 Uhr

Hallo zusammen,

ich habe das Problem, dass mein ServerObjekt, welches die Job_Query verwaltet mehrfach instanziert wird.

Die Vorgehensweise ist wie folgt:

Ich versuche aus einer Unmanaged-Anwendung (in Visual C++ 6 geschrieben) auf die Diente des .NET-Remoting Frameworks zuzugreifen.
Dafür habe ich eine Wrapper-Klasse geschrieben, die COM-sichtbare Methoden veröffentlicht, um den Zugriff aus VC++ Code zu ermöglichen.
Die Remote-Klasse ist im Singleton-Modus konfiguriert, so dass alle Client-Anfragen von einer Server-Instanz bedient werden. Da meherere Clients
gleichzeitig auf die öffentlichen-Dienste zugreifen können, habe ich das Thread-safe Singleton-Pattern eingesetzt.

Die Mehrfachinstanzierung tritt in unregelmäßigen nicht reproduzierbaren Abständen auf, wenn zwei Anfragen zeitgleich am Server ankommen oder wenn ein größerer Job abgearbeitet wird während eine neue Anfrage kommt.

Folgend habe ich den dafür verantwortlichen Code angehängt.

Ich würde mich freuen, wenn jemand eine Idee hat.

Gruß, maYer

Managed-Code:


public sealed class QueryManager : MarshalByRefObject, Idisposable
{ 
      private static volatile QueryManager instance;
      private static object syncRoot = new Object();
      ...

      public static QueryManager Instance
      {
            get
            {
                if (instance == null)
                {
                    lock (syncRoot)
                    {
                        if (instance == null)
                        {
                            instance = new QueryManager();
                        }
                    }
                }
                return instance;
            }
      }
}

Wrapper-Klasse


[ClassInterface(ClassInterfaceType.AutoDual)]

public class RemoteClient
{
    public RemoteClient(){}

    public bool AddJob()
   {
      QueryManager queryManager = QueryManager.Instance;
      queryManager.AddJob();
   }
}

Unmanaged-Client


#import "UnmanagedClient.tlb" 
using namespace UnmanagedClient;

_RemoteClientPtr objCom(__uuidof(RemoteClient));

  if (objCom)
  {
     if (objCom->AddJob() != VARIANT_FALSE)              
     {
      }
  }
12.10.2007 - 13:21 Uhr

Jap, hat jemand

btw. super Idee 😉

12.10.2007 - 09:05 Uhr

Hallo herbivore,

wie soll er das beantworten?
Man meldet sich ja nicht mit seinem Nick Namen an.

Gruß, maYer

29.09.2007 - 03:31 Uhr

Hi, eigentlich nicht.
Ein bisschen Anonymität muss auch hier im Forum bleiben 😉

Aber es war auch noch nicht der Fehler. Es war nur ein Verstärker wodurch die Reaktion der Applikation dann zu Tage gekommen ist.
Der eigentlich Auslöser muss noch wo anders liegen.

Aber wir werden auch das noch in den Griff bekommen.

Gruß, maYer