Laden...
Avatar #avatar-2079.jpg
kleines_eichhoernchen myCSharp.de - Member
Softwareentwickler Ursprünglich Vogtland, jetzt Much Dabei seit 07.11.2006 3.971 Beiträge
Benutzerbeschreibung

Forenbeiträge von kleines_eichhoernchen Ingesamt 3.971 Beiträge

29.07.2010 - 08:08 Uhr

Alternative zu obigen Code:



delegate void ThreadMethodDelegate(int i);

static void Main() {
  IAsyncResult results = new IAsyncResult[5];

  ThreadMethodDelegate del = new ThreadMethodDelegate(ThreadMethod);
  
  for (int i=0; i<results.length; ++i) {
    results[i] = del.BeginInvoke(i, null, null); // AsyncCallback und state werden nicht gebraucht
  }
  for (int i=0; i<results.length; ++i) { 
    del.EndInvoke(results[i]);
  }
}

static void ThreadMethod(int i) {
  ...
}

Falls du dennoch ein WaitHandle brauchst, jede IAsyncResult-Instanz hat eine 😉

  
Random r = new Random();  
  

Gehört zwar nicht zur Frage, durch diese Anweisung kriegst du pro Thread immer die gleichen Zufallszahlen, weil als Standard Seed immer die aktuelle Zeit verwendet wird und diese hat sich beim Starten von 5 Threads nun wirklich nicht verändert.

Siehe dazu Probleme mit Random auf Multicore

23.07.2010 - 15:06 Uhr

Guck mal ob du das direkt an den WebRequest wie im BeispielWebProxy Class schreiben kannst.

23.07.2010 - 14:44 Uhr

Eventuell den Haken Automatic Proxy im Internet Explorer rausnehmen

http://www.aub.edu.lb/services/proxy/ie.html

23.07.2010 - 13:23 Uhr

Stell dein VS so ein dass du den MS Code debuggen kannst, gehe schritt für schritt durch und schau mal wo die Ausführung hängen bleibt.

23.07.2010 - 08:21 Uhr

Spätestens ab Vista braucht man auch kein Uninstall-Shortcut mehr.

Klick auf Start -> Suche nach "Programme" oder "Funktion" -> Auswahl "Programme und Funktionen" -> das richtige Auswählen -> Deinstallieren.

21.07.2010 - 12:38 Uhr

Wenn deine Anwendung eine 32Bit Komponente benutzt, muss deine Anwendung auch als 32Bit kompiliert werden. 64Bit und 32Bit lässt sich im selben Prozess nicht mischen!

Welche genaue Fehlermeldung(eventuell Ereignislog) erhältst du, wenn du deine 32Bit kompilierte Anwendung (nicht any!) auf einem 64Bit Windows startest?

21.07.2010 - 12:35 Uhr

Möglicherweise fehlt dem Addin irgendein Verweis. Sind die PIAs installiert/der Anwendung beigelegt?

20.07.2010 - 12:21 Uhr

Hallo MrSparkle,
ich persönlich mag ja auch regex sehr. Nur für xml/sgml gibt es bessere und auch in meinen Augen viel einfachere Möglichkeiten, beispielsweise XPath. Regex lässt sich in meinen Augen als außenstehender schwer lesen und später auch nur schwer anpassen.

Wer Wert auf Geschwindigkeit und dennoch nicht auf XPath nicht verzichten möchte, kann auch direkt XPathDocument-Klasse

Hallo hrmc,
String ist eine immutable-Klasse. Dort gibt es kein Add,Insert, Remove wie bei StringBuilder. Um zwei Strings mit einander zu verketten, gibts in C# den +Operator.

20.07.2010 - 08:23 Uhr

ganz so einfach ist es nciht.... .net 4.0 unterstützt das gleichzeitige ausführen verschiedener .net versionen...

Sicherlich aber nur in seperaten AppDomains. Ist CLR 4 abwärtskompatibel zu CLR2 - lässt sich also in eine 4er AppDomain eine Assembly laden, die gegen CLR 2 kompiliert wurde? Wenn nicht, würde MrSparkle's Pluginsystem nicht funktionieren.

19.07.2010 - 13:13 Uhr

Nimm XPath. Mit /html/body/p/b findest du alle MP3-Nodes und mittels XmlNode.NextSibling kommst du an das drauffolgende Span-tag und dort kannst du innerText aufrufen.

Wenn es sich nicht um gültige XHtml-Seiten handelt -> Laden einer nichtvaliden Html-Seite in eine XElement - Klasse

16.07.2010 - 08:01 Uhr

Doch die gibt es. BitmapImage.StreamSource-Eigenschaft

Eventuell blendet die Eigenschaft VS nur aus.

16.07.2010 - 07:59 Uhr

Ansonsten kommst du vllt. Reverse Engineering des betroffenen Programms weiter.

15.07.2010 - 08:30 Uhr

Wenn das .NET Framework sich nicht deinstallieren lässt:
Removal tool to fix .NET Framework install failures

Aus eigener Erfahrung kann ich sagen, dass Ding ist super.

Es würde ausreichen, wenn du .Net 3.5 SP1 installiert (etwa 200 MB), dort ist 2.0 SP2 und 3.0 bereits enthaten

15.07.2010 - 08:24 Uhr

Gewitter find ich auch super. Ich steh auch nachts auf und guck mir das ganze an.

Was blöd ist, ist der Wind, mein Gartenhäusschen hats gestern zerlegt X(

14.07.2010 - 08:41 Uhr

Ich versteh nicht so 100%ig wie man durch lock eine faire Parallelität erreichen könntest

Ich hab jetzt nicht alles durchgelesen, aber eventuell hilft dir folgendes:
Round-Robin Access To The ThreadPool(Englisch)
Roundrobin-Zugriff auf den ThreadPool(Deutsch)

Wenn ich mich recht entsinne, kann das aber auch der Smart Thread Pool

14.07.2010 - 08:33 Uhr

Auf dem Entwicklungsrechner, was ist dort für eine .NET Version installiert? Eventuell irgendeine Beta? Welche Visual Studio benutzt du?

Das System kann die Assembly System.Xml nicht finden

Wird in der Fehlermeldung der vollqualifizierende Assemblyname genannt (Name, exakte Versionsnummer, Kultur und public Token)?

09.07.2010 - 12:55 Uhr

Hallo Ruben,
ist nicht böse gemeint, aber bitte befass dich erstmal mit den Grundlagen über multithreaded Programmierung.

Concurrency:What Every Dev Must Know About Multithreaded Apps(MSDN)

Theoretisch kann man dann auch 3 Threads machen:

  • einer der die Anforderungen abarbeitet (nehmen wir mal den MAIN)
  • einer der den eigentlichen Code ausführt (zwar der Hauptthread, aber nur woanders ausgeführt)
  • und einer der den 2. Thread darstellt

Du musst als erstes mal wissen, was du parallel ausführen lassen willst - besonders auch was sinnvoll ist und Mehrwert mit sich bringt - und du musst wissen, welche kritischen Bereiche deine Anwendung hat (welche Bereiche strikt zeitlich gesehen nacheinander laufen müssen) oder aber welche Anweisungen in einem bestimmten Thread laufen müssen (Stichwort STA COM-Objekte und WinForms)

09.07.2010 - 12:41 Uhr

Mutexe werden in .NET nur für systemweite kritische Bereiche (Mutex mit Namen) gebraucht. Wenn du den Mutex nur brauchst um innerhalb deiner Anwendung kritische Bereiche zu schützen/definieren, benutze lieber lock, ist einfacher und vermutlich auch etwas fixer.

Queue:
Wenn du aus einer Queue mittendrin Elemente entfernen willst, solltest du dir eine eigenen Queue-Wrapper bauen und innerhalb eine LinkedList verwenden. Queue und List arbeiten intern mit Arrays, entfernst du ein Element aus der Mitte, muss das Array neu zusammenkopiert werden.

09.07.2010 - 08:08 Uhr

Daher habe ich mir ein Konstrukt ausgedacht welches nicht 100% dem Producer/Consumer Konzept entspricht

So ein denken ist mist. Warum sollte ein Prozess, egal welcher Art, nicht die zur Verfügung stehenden Kapazitäten voll ausschöpfen dürfen? Auf Arbeit gibts du ja sicherlich auch ca./an die 100% und nicht 10% Montags, 20% Dienstags, etc.

Etwas anderes ist es, wenn ein Prozess nicht den kompletten Rechner blockieren/auslasten soll. Doch das geht in Windows einfacher und effizienter mit Prioritäten. Wenn du deinen Threads eine niedrige Priorität und zusätzlich dem Prozess niedrige Priorität zuweist, bekommen die einzelnen Threads nur Rechenzeit, wenn andere Threads gerade nicht ausgeführt werden.

Etwas kritischer siehts mit IO Zugriffen, denn dort gibts von Windows aus kein Scheduling.

globales AutoResetEvent

Sowas find ich persönlich auch nicht toll. Kapsel jeweils eine Queue und ein WaitHandle lieber in eine seperate Komponente und stecke die einzelnen Komponente in der Main-Methode zusammen. Später kannst du dann leicht(er) das ganze auf ein MultiCore-System umbauen und so das ganze hochskalieren.

Eventuell ist auch folgender Link was für dich:
Nach Reihenfolge geordnete Ausführung mit ThreadPool

08.07.2010 - 08:16 Uhr

Ob das Problem bekannt ist, weiß ich nicht. Du kannst allerdings die Prüfung auf die Versionsnummer auch anpassen, wenn du das für richtig hältst und es dein Problem lösen oder umgehen würde.

gehe dazu in dein Programme-Verzeichnis\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\DotNetFx20SP2 und öffne dort die Datei Products.xml (jede "Bedingung" wird über die Products.xml gesteuert).

Dort hast du einmal InstallChecks und einmal InstallConditions.

Der oben genannte Pfad gilt für Visual Studio 2008. Für 2005 findest du das ganze unter Programme\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper

05.07.2010 - 12:45 Uhr

Lösung wäre die Serialisierungsassembly bereits "vorzukompilieren". Wie das geht und was das ist:
XML Serializer Generator-Tool (Sgen.exe)

Ansonsten halt im Event noch ein zusätzliches If zur Überprüfung einbauen (MeineDll.XmlSerilizers).

02.07.2010 - 21:42 Uhr

XmlReader xReader = ...;
IXmlLineInfo lineInfo = xReader as IXmlLineInfo;

...

xReader.Read();
if (lineInfo != null && lineInfo.HasLineInfo()) {
  Console.WriteLine("line: {0}, pos: {1}", lineInfo.LineNumber, lineInfo.LinePosition);
}

das Casting ist zwar nicht schön, aber denke akzeptabel.

02.07.2010 - 08:22 Uhr

Hier nochmal ein genaues Beispiel zu Jacks und dN!3L und was zu beachten ist:
Assembly Resolution with AppDomain.AssemblyResolve

Der sicherste Weg, ohne seperate AppDomain wäre die CLR manuell zu hosten und das Probing "abzufangen":
[

Process wide AssemblyResolve event.](http://www.windows-tech.info/13/59e04d988d5bb843.php)

01.07.2010 - 13:09 Uhr

AssemblyResolve und UnhandledException funktioniert an der Stelle nicht (richtig), da die CLR möglicherweise vor dem Aufruf von Main die Assembly versucht zu laden.

Wann die CLR eine Assembly lädt, ist nicht exakt definiert.

01.07.2010 - 08:00 Uhr

Klar geht das. Du prüfst in der Main-Funktion alle Assemblies. Sind alle vorhanden, erstellst du eine seperate AppDomain und führst entsprechend erst hier die eigentliche Anwendung in der AppDomain aus.

Du darfst allerdings nirgends in der Exe einen Typen einer externen Assembly (die Assemblies vom .NET Framework natürlich ausgeschlossen!) verwenden. Deine Anwendung muss somit komplett in einer Bibliothek ausgelagert worden sein. Erst dann kannst du sicher sein, dass die Runtime dir nicht zuvor kommt und deine Anwendung vor der Ausführung von Main schon abschießt.

Auch typeof(TYPE) beim Instanzieren(CreateInstance) ist tabu. Nur den vollqualifizierenden Namen verwenden!

30.06.2010 - 13:25 Uhr

Man könnte zusätzlich noch einen Zuweisungoperator und einen Vergleichsoperator hinzufügen, beide vom Typ Object. Wird etwas anderes als null übergeben, sollte hingegen eine Exception geworfen werden.

man muss dann nur aupfassen, dass man nicht sowas bastelt:


UndefinableValue<Foo> foo = ...;
bool bar = false;

if (foo == bar) {
}

Der Fehler würde erst zur Laufzeit auftreten und nicht schon zur Compilezeit.

29.06.2010 - 12:07 Uhr

Du sagst, du willst das machen, weil du sonst Probleme mit COM Komponenten hast? Meines Wissens dürfte es für COM keine AppDomain Grenzen geben

Gibts auch nicht, C(++) und die WinAPI kennen keine AppDomains. Allerdings wird es zu fehlern kommen, wenn es sich um STA COM Objekt handelt. Hier darf der Zugriff auf das COM Objekt nur von einem Thread aus erfolgen.

Objekte die mittels Remoting übertragen werden sollen (auch bei AppDomains) müssen entweder von MarshalByRefObject abgeleitet sein (Referenztyp Verhalten) oder aber serialisierbar sein (Werttyp Verhalten).

Ist keines von beiden gegeben, kommt es zu einem Laufzeitfehler. Um das zu Lösen,musst du für jede zu übertragende Klasse einen Wrapper schreiben, der entweder von MarshalByRef abgeleitet ist oder eben ISerializable implementiert.

28.06.2010 - 08:17 Uhr

Ich glaube nicht, dass es möglich ist, mit einer x64 Testanwendung sowohl x32 UND x64 Assemblys zu laden, richtig?

Richtig. Bei 64Bit gehen nur 64Bit Verweise und nichts anderes.

Das gleiche gilt bei AnyCPU, wenn die Anwendung auf einem 64Bit Windows ausgeführt wird, dort gehen auch nur 64Bit Verweise.

24.06.2010 - 17:43 Uhr

Du musst dich aber für eine Anwendung entscheiden. Wenn du dir nicht sicher bist, stelle auf 32Bit.

Any CPU macht Probleme, wenn du auf 64Bit Windows eine 32Bit Bibliothek verwendest. dort kommt es dann zu einer FileNotFound-Exception.

24.06.2010 - 15:34 Uhr

Die aktuellen 64Bit Windows Betriebssysteme können auch 32Bit Anwendungen ausführen. Allerdings ist es nicht möglich einen Mischprozess zu haben, wo gleichzeitig 32Bit und 64Bit Module enthalten sind.

Also wenn du eine 32Bit Bibliothek hast, muss auch die Anwendung und alle anderen Verweise in 32Bit vorliegen.

24.06.2010 - 14:05 Uhr

In einem 64Bit Programm müssen alle Assemblies auch als 64Bit kompiliert sein (oder ANY CPU). Selbst AppDomains nützen da nix.

Der Grund ist ganz einfach, in 64Bit ist ein Zeiger (.NET System.Intptr) doppelt so groß wie in einem 32Bit Prozess. Ein Austausch zwischen 64Bit und 32Bit Assembly ist nur möglich, wenn nur innerhalb der ersten 4GByte Grenze (2^32) die Objekte liegen.

Wenn es sich um ThirdParty Bibliotheken handelt, die nicht in 64Bit vorliegen, kannst du diese auch in einem eigenen Unterprozess ausführen und Daten mittels Remoting oder MemoryMappedFiles austauschen.

23.06.2010 - 13:19 Uhr

kennt ihr evtl eine elegante lösung?

Ja, kein Visual Studio Setup Projekt benutzen, sondern beispielsweise Windows Installer XML (WiX) toolset (MSI). In MSI kann ich ganz genau definieren, wann eine CustomAction (nehme an jetzt benutzt die Installer-Klasse) ausgeführt werden soll.

Ich hab bisher noch keine Möglichkeit in VS gesehen, wo man die Sequenznummer der CA angeben kann.

Alternativ könntest du mittels Orca.exe (Windows Installer SDK 4.5) die MSI nachträglich ändern (InstallExecuteSequenz -> richtige CA heraussuchen und Sequenz erhöhen).

Das ganze ließe sich auch automatisch ausführen, gibt da von MS so eine Deployment Bibliothek (auch für C#). Schätze aber du wirst bei beiden Varianten am kryptischen Namen der CA scheitern.

23.06.2010 - 07:40 Uhr

MemoryStream ist nur der Ursprung des Bildes. Das Bild liegt dann quasi auch zweimal im Speicher (einmal MemoryStream und einem Bild-Instanz)

Was du allerdings machen kannst, das Bild manuell mittels WinAPI öffnen und jeder AppDomain das Handle mitteilen und davon dann eine Bitmap-Instanz oder in deinem Fall BitmapImage zu holen. Solltest dir aber ganz genau überlegen, an welcher Stelle du das Handle wieder zerstörst.

22.06.2010 - 14:37 Uhr

Objekte an Thread mit "call by reference"

Geht natürlich auch mit einem Timer. Statt eines eigenen Objektes kannst du auch objectState verwenden - finde ich aber persönlich nicht so toll

22.06.2010 - 14:05 Uhr

Process.Kill-Methode

Wie du an den jweiligen Prozess kommst, hat zommi bereits geschrieben

22.06.2010 - 13:56 Uhr

Threading kann ganz normal für andere "Dienste" verwendet werden, beispiel Bereitstellen/Sammeln von Daten aus externen Quellen.

Die eigentliche Verarbeitung von HTTP-Request muss aber synchron erfolgen.

22.06.2010 - 11:43 Uhr

In C# kann man keine C++ Header einbinden.

Wenn du Funktionen aus der WinAPI verwenden möchtest, google mal nach P/Invoke

22.06.2010 - 08:12 Uhr

Threading funktioniert aus logischen Aspekten in Webanwendungen nicht. Zu jeder Anfrage gibts auch eine direkte Antwort und das ist mit asynchroner Verarbeitung nicht gegeben.

Für das was du vorhast, musst du AJAX verwenden - die Asynchronität kommt immer vom Browser.

21.06.2010 - 07:56 Uhr

Das ganze ist rein aus Neugier, wie ein Setup funktioniert und zum Spaß.
Einfach nen kleinen Installer machen ist auch eine spaßige Beschäftigung.

Hol dir das Buch was ich oben beschrieben, da steht mehr wissenswertes drin, als du jemals über Registry oder Kommandozeilenparameter rausfinden wirst.

Außerdem, die Welt braucht nicht noch ein Installer. Nimm die bereits existierenden, für Windows, vorzugusweise MSI. Den Spaß mit rumprobieren hast du auch dort.

Um die Liste zu vervollständigen, NSIS (Nullsoft Scriptable Install System)

18.06.2010 - 19:30 Uhr

Inside Windows Installer 4.5

Dort geht prinzipiell um die Funktionsweise von MSI-Installpaketen und wie man diese mit WIX erstellt.

Was mich auch interessieren würde, wie man z.B. für Windows Vista/7 ein Spiel in den "My Games" Ordner registrieren kann 😉

Das werden warscheinlich "nur" Registry-Einträge sein, die man in MSI definiert

18.06.2010 - 19:22 Uhr

Du wirst nicht drum rum kommen, dir einen Wrapper für folgende Methoden zu schreiben:

Wenn sich managed und unmanaged im selben Prozess befinden, kannst du die Handles innerhalb des Prozesses mit Funktionen austauschen. Wenn nicht (ist auch die sichere Variante), verwende bei CreateEvent mit eindeutigen (Guid). Jeder Aufruf von CreateEvent muss auch mit CloseHandle wieder geschlossen werden (Dispose)

Eventuell ist es möglich direkt von WaitHandle zu erben.

18.06.2010 - 09:48 Uhr

Flash ist der größte Mist der jemals erfunden wurde. Flash macht nur Sinn für Anwendungen die im Browser laufen. Beispiel Spiele.

Für irgendwelche Ticker, Banner oder Bundesliga-Tabellen braucht man kein Flash. Das geht mit HTML und Javascript viel einfacher und Ressourcenschonender - und vor allem nervt dass nicht wie Banner mit Sound.

Ich hoffe es setzt sich schnell im web das video-Tag durch, dann kann ich endlich den Mist vom Rechner runterhauen. Ansonsten, NoScript ist die beste Erweiterung für Firefox.

15.06.2010 - 21:34 Uhr

Erstelle dir eine kleine Hilfsklasse zum "Suchen" der Plugins und führe die Klasse in einer temporären Domain aus. Sind alle Plugins gefunden und geladen, verwerfe die Domain anschließend.

Die kleine Hilfsklasse könnte wie folgt aussehen:


internal class PluginSearcher : MarshalByRefObject { /* explizit internal da nur Hilfsklasse */
   public PluginSearcher() { } // Standard Konstruktor

   public void StartSearch(string path) { }

   public Action<string /* filename */, string /* classname */> OnPluginFound { set; } // Bei Bedarf auch als Event möglich
}

Benutzung wäre dann wiefolgt:


void Main() {
  var appSetup = new AppDomainSetup();
  ...

  var Domain = AppDomain.Create(appSetup);
  var pluginSearcher = (PluginSearcher)Domain.CreateInstance(typeof(PluginSearcher));
  pluginSearcher.OnPluginfound = OnPluginFound;
  pluginSearcher.StartSearch(AppDomain.Current.ApplicationPath);
  Domain.Unload();
}

void OnPluginFound(string assemblyFile, string typename) {
   ...
}

11.06.2010 - 12:50 Uhr

Ansonsten nützt die Aufteilung in Threads eh nicht viel. Wenn dann müsstest du in AppDomains aufteilen.

Das geht auch nur mit WPF Controls und auch nur wenn man System.Addin verwendet. Ein WinForms-Control/Handle kann nicht AppDomain-/Prozessübergreifend verwendet werden.

10.06.2010 - 12:31 Uhr

Wer mehr als zwei Parameter braucht und doppelten Code nicht mag, sollte sich mal in Visual Studio T4 Code Generation anschauen (kein Addin nötig, ist in VS 2008 bereits enthalten!)

T4 (Text Template Transformation Toolkit) Code Generation - Best Kept Visual Studio Secret

10.06.2010 - 07:50 Uhr

Das mit dem delArgs und dem Rückgabewert Object gefällt mir noch nicht so ganz.

Cool wäre wenn man wie bei Func<T, TRET> die Einzelnen Parameter nicht geboxt werden müssten