myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Funktion mit zwei Parametern als Thread aufrufen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Funktion mit zwei Parametern als Thread aufrufen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Skato
myCSharp.de-Mitglied

Dabei seit: 15.10.2010
Beiträge: 46
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Hessen


Skato ist offline

Funktion mit zwei Parametern als Thread aufrufen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,
ich würde gerne die Methode transmit.fm(dataBuffer, datalenght);
als Thread aufrufen, da das verarbeiten der Methode den restlichen Ablauf des Programms zu sehr verzögert. Daher würde ich es gerne vom rest abkoppeln.

C#-Code:
using transmitter

namespace poster
{
public class IoPacket
    {

public void PostReceive()
        {

            try
            {

            transmit.fm(dataBuffer, datalength);

           }
.
.
.

Die Methode schaut so aus:

C#-Code:
namespace poster
{

    class transmit
    {

public static void fm(byte[] buffer, int bytesRead)

        { ... }
.
.
.

diese benötigt ein Bytearray und die Länge des Bytearrays als Integer.

Wie kann ich denn nun die Methode als Thread aufrufen und das Bytearray, Integer mitübergeben?

Parameterized Thread Start akzeptiert ja nur einen Parameter. Wie dann aber jetzt mit zweien?

Könnte mir bitte jemand dabei helfen?



mfg
skato

Edit: Methode nicht Funktion

Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von Skato am 01.12.2010 03:56.

30.11.2010 23:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.548
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

Zitat:
Parameterized Thread Start

das bedeutet auch selbst einen Thread erstellen was in den meisten Fällen schlechter ist als eine Thread aus dem ThreadPool zu verwenden.

C#-Code:
byte[] dataBuffer= ...;
int datalenght= ...;

ThreadPool.QueueUserWorkItem(_ => transmit.fm(dataBuffer, datalenght));

Das funktionert aufgrund von Closures und so ist es auch der bevorzugte Weg eine Methode (nicht Funktion, da in C# alles Methoden sind) in einem (ThreadPool-) Thread auszuführen.
Ohne Closures siehe Bitte schau in die SDK-/MSDN-Doku für QueueUserWorkItem.

Ab .net 4.0 bietet es sich an mit Tasks zu arbeiten, also

C#-Code:
byte[] dataBuffer= ...;
int datalenght= ...;

Task.Factory.StartNew(() => transmit.fm(dataBuffer, datalenght));

BTW: Schau dir mal  Namenskonventionen an.


mfG Gü
01.12.2010 00:08 Beiträge des Benutzers | zu Buddylist hinzufügen
xxMUROxx xxMUROxx ist männlich
myCSharp.de-Mitglied

avatar-3236.jpg


Dabei seit: 11.01.2010
Beiträge: 1.552
Entwicklungsumgebung: VS 13, SSMS 12
Herkunft: Südtirol/Italien


xxMUROxx ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Skato,

Es gibt noch 2 andere Möglichkeiten

1: Ruf die transmit.fm(dataBuffer,datalength) in einer separaten Methode auf, und nicht direkt als Parameter der Thread.Start Methode. Deklarier dataBuffer,datalength lokal, dann kannst du die foo Methode im neuen Thread starten sofern dataBuffer,datalength den Zugriff zulassen.

C#-Code:
private void foo()
{
    transmit.fm(dataBuffer, datalength);
}

Dann gibs 2 Möglichkeiten:
2: Erstell eine Hilfsmethode die du dann wie folg die foo(o) in der ParameterizedThreadStart aufrufst.

C#-Code:
private void foo(object o)
{
    object[] oo = (object[])o;
    transmit.fm(oo[0], oo[1]);    //auf das richtige Casten
}

Gruß
Michael
01.12.2010 00:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Skato
myCSharp.de-Mitglied

Dabei seit: 15.10.2010
Beiträge: 46
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Hessen

Themenstarter Thema begonnen von Skato

Skato ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke!

ich hab das jetzt so realisiert:

C#-Code:
ThreadPool.QueueUserWorkItem(_ => transmit.fm(dataBuffer, datalenght));

Ich verwende übrigens das Net 3.5

Ist denn Thread Start so schlecht?

mfg
skato
01.12.2010 03:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
kleines_eichhoernchen kleines_eichhoernchen ist männlich
myCSharp.de-Mitglied

avatar-2079.jpg


Dabei seit: 07.11.2006
Beiträge: 3.971
Entwicklungsumgebung: Visual Studio 2005 (C#)
Herkunft: Ursprünglich Vogtland, jetzt Much


kleines_eichhoernchen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Geht auch super via Delegate.BeginInvoke. Einfach ein passendes Delegate erstellen, bzw. Action<> oder Func<> verwenden. Damit musst du nicht auf Typsicherheit verzichten und kannst auch wenn du brauchst einen Rückgabewert verwenden.

Schau dir bitte auch den Rückgabewert von BeginInvoke. Mit dem Waithandle hast du automatisch eine Thread.Join-Funktion.

Nachteil des ganzen, beim Aufruf von BeginInvoke solltest du später EndInvoke aufrufen. Besonders bei den MS Implementationen könnten sonst Speicherlecks entstehen.


Selber Threads zu erstellen, ist meist nur sinnvoll, wenn du die volle Kontrolle(Überwachung) über den Thread brauchst oder es sich um eine "lange" Aufgabe handelt. Wenn du nur etwas parallelisieren möchtest, ist die direkte Verwendung von Thread verkehrt, da allein das Erstellen des eines neuen Threads Ressourcen und Zeit verbraucht. Threadpool (BeginInvoke zählt auch dazu) verwenden existierende Threads, die nur drauf warten endlich mal was zu tun zu bekommen.
01.12.2010 07:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Skato
myCSharp.de-Mitglied

Dabei seit: 15.10.2010
Beiträge: 46
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Hessen

Themenstarter Thema begonnen von Skato

Skato ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

vielen Dank! das habe ich garnicht gewusst!

also sollte ich anstatt:

//Die TCP-Server (Listener) Threads für RM und FM starten

C#-Code:
            //R1 Server Thread
            Thread R1_Server = new Thread(listener_R1.R1_main);
            R1_Server.Start(); //Thread starten

            Thread.Sleep(300);

            //R2 Server Thread
            Thread R2_Server = new Thread(listener_R2.R2_main);
            R2_Server.Start(); //Thread starten

            Thread.Sleep(300);

            //RM Server Thread
            Thread FM_Server = new Threading.Thread(listener_fm.fm_main);
            FM_Server.Start(); //Thread starten

            Thread.Sleep(300);

immer dies hier benutzen ?

C#-Code:
ThreadPool.QueueUserWorkItem(_ => listener_R1.R1_main());

Die Methoden laufen ja eh in einer Dauerschleife und werden erst beendet wenn das Programm geschlossn wird. Es geht halt hauptsächlich um Paralellisierung.

mfg
skato

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Skato am 01.12.2010 09:56.

01.12.2010 09:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.461
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Skato,

in dem Fall laufen die Threads (relativ) lange und der Vorteil der geringeren Startzeit fällt nicht ins Gewicht. Dagegen entsteht der Nachteil, dass du ThreadPool-Threads, die vielleicht später für andere Aufgaben benötigt werden, eben relativ lange blockierst. Im konkreten Fall solltest du also bei normalen Threads bleiben.

herbivore
01.12.2010 10:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Skato
myCSharp.de-Mitglied

Dabei seit: 15.10.2010
Beiträge: 46
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Hessen

Themenstarter Thema begonnen von Skato

Skato ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

vielen dank! das ist gut zu wissen
01.12.2010 19:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 8 Jahre.
Der letzte Beitrag ist älter als 8 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 18.08.2019 01:41