Multi Threading Problem

13/10/2009 - 08:12 von AyrA | Report spam
Hallo Newsgroup
Ich habe folgendes C# Problem:

Wenn ich einen System.Net.WebClient erstelle und die Events verknüpfe,
kann ich mit DownloadFileAsync(Uri, string) eine Datei herunterladen.
Wenn der Download abgeschlossen ist, wird der Event ausgelöst und in
einem Label der Text "Download Beendet" angezeigt
(lblNotify.Text=STR_FINISHED).
Da Sockets solche Events nicht
mitbringen, habe ich eine Klasse geschrieben, welche Einfache
Server-Client Operationen auf TCP/IP Ebene anbietet. Damit der
aufrufende Thred nicht blockiert wird, làuft der Server in einem anderen
Thread. Für die Server Funktion (Verbindung eingegangen) und die Client
Funktionen (Verbindung Erfolgreich, Daten Erhalten) habe ich Events
erstellt, die bei den betreffenden Ergeignissen ausgelöst werden. Jetzt
ist es so, dass wenn Daten ankommen und ich diese gerne in einer Textbox
angezeigt hàtte, Visual Studio ausruft, dass ein solcher
Threadübergreifender Vorgang nicht erlaubt ist, da ich die "Daten
Empfangen" Funktion in einen Thread ausgelagert habe, damit der
aufrufende Thread nicht blockiert wird. Ich meinerseits habe keine Lust,
überall in meiner Form irgendwelche Invokes zu platzieren.

Meine Frage also:
Was muss ich tun, damit ein Invoke bei einem von einem fremden Thread
ausgelöstem Event nicht mehr notwendig ist? (So wie beim WebClient)

AyrA

http://ayra.ch
Everything you need that your IT hates you!
SSL supported:
https://ayra.ch
about 10 pr0xys, a Batch Creator and a Dial up Simulator
 

Lesen sie die antworten

#1 Frank Dzaebel
13/10/2009 - 08:55 | Warnen spam
Hallo AyrA,

Ich meinerseits habe keine Lust, überall in meiner
Form irgendwelche Invokes zu platzieren.
Meine Frage also:
Was muss ich tun, damit ein Invoke bei einem von einem fremden Thread
ausgelöstem Event nicht mehr notwendig ist? (So wie beim WebClient)



Normalerweise kapselt man ja auch diese Dinge
in Komponenten/Klassen/Services, die dann von aussen
solche Invoke's nicht mehr direkt durchführen, sondern
über Methoden-Aufrufe aus den Klassen-Instanzen.
Ein typisches Mittel ist ja auch der BackgroundWorker.

[Bearbeiten von Steuerelementen aus Threads]
http://dzaebel.net/ControlInvoke.htm

[Übersicht über ereignisbasierte asynchrone Muster]
http://msdn.microsoft.com/de-de/lib...wczdw.aspx

http://www.cleancodedeveloper.net/w...yPrinciple
http://www.cleancodedeveloper.net/w...ofConcerns

[FTP Upload mit Byte-Anzeige]
http://dzaebel.net/FtpUpload.htm


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen