threads in c#



  • hallo,
    ich lerne gerade etwas c#, nun bin ich beim thema threads geladet, was ist der unterschied zwischen synchronen und asynchronen threads?
    und wie kann man einem thread/threadfunction einen parameter, oder mehrere übergeben?

    MFG



  • Es gibt keine synchronen oder asynchronen Threads.
    Um Parameter an andere Threads zu übergeben gibt es viele Möglichkeiten. Einerseits gibt es eine Art ThreadStartDelegate mit object-Parameter andererseit kannst du, da ein Delegate sowohl statische als auch Instanzmethoden sein darf, beliebige Datenelemente zu der Klasse hinzufügen, in der sich die Methode befindet, in der der Thread startet.

    Disclaimer: Ich bin dicht.



  • wie schaut das mit ThreadStartDelegate konkret aus?



  • static class ThreadTest
    {
    	private static void Main()
    	{
    		Thread thread = new Thread(foo);
    		thread.Start("dingdong");
    	}
    
    	private static void foo(object obj)
    	{
    		Console.Out.WriteLine((string)obj);
    	}
    }
    


  • hm, das funktioniert nicht:
    ich denk mal das static class ist nicht ok!

    ohne dem static bei class:

    error CS0654: Method 'ConsoleApplication1.ThreadTest.foo(object)' referenced without parentheses
    error CS1501: No overload for method 'Start' takes '1' arguments
    

    was sind eigentlich genau Delegates, ne art Funktionszeiger?



  • geri schrieb:

    hm, das funktioniert nicht:
    ich denk mal das static class ist nicht ok!

    ohne dem static bei class:

    error CS0654: Method 'ConsoleApplication1.ThreadTest.foo(object)' referenced without parentheses
    error CS1501: No overload for method 'Start' takes '1' arguments
    

    was sind eigentlich genau Delegates, ne art Funktionszeiger?

    ganz genau Delegates sind genau dies! 👍
    Guck Dir mal an wenn Du nen Button auf dein Formular ziehts und Du diesen doppelt
    anklickst was der automatische Code - Designer macht um die Event - Callback - Geschichte ins rollen zu bringen. Dann hat man schon ne Menge zu Delegates
    gesehn.

    mfg sclearscreen



  • geri schrieb:

    hm, das funktioniert nicht:
    ich denk mal das static class ist nicht ok!

    ohne dem static bei class:

    error CS0654: Method 'ConsoleApplication1.ThreadTest.foo(object)' referenced without parentheses
    error CS1501: No overload for method 'Start' takes '1' arguments
    

    Ich benutze C# 2.0. Das static bei class musst du weglassen, den anderen Fehler check ich jetzt nicht. Vielleicht musst du es etwas anders machen. Ich finde die Methode mit dem Instanz-Delegate eh meistens besser.



  • hi, warum geht das nicht?

    namespace ConsoleApplication1
    {
    	class ThreadTest
    	{
    		static void Main() 
    		{
    			ThreadStart threadDelegate = new ThreadStart(Work.DoWork);
    			Thread newThread = new Thread(threadDelegate);
    			newThread.Start("dingdong");
    		}
    	}
    
    	class Work 
    	{
    		public static void DoWork(object obj) 
    		{
    			Console.Out.WriteLine((string)obj);
    		}
    	}
    }
    


  • sclearscreen schrieb:

    ganz genau Delegates sind genau dies! 👍

    Nicht ganz. Bei einem Funktionszeiger muss die Anzahl der Parameter inklusive this zur Compile-Zeit feststehen, Delegates können mit und ohne this-Parameter aufgerufen werden. Ein weiterer sehr wesentlicher Unterschied ist, dass das this-Objekt nicht zur Aufrufzeit angegeben wird:

    IrgendwasDelegate myDelegate;
    myDelegate = myObject.myMethod;  // Man beachte, dass zur Zeit der Zuweisung das Zielobjekt feststeht!
    
    // 20 Stunden später
    
    myDelegate();
    // bei Funktionszeigern würde man jetzt das this-Objekt auswählen
    // myObject->myDelegate() // keine Ahnung, irgendwie so  :)
    

    Guck Dir mal an wenn Du nen Button auf dein Formular ziehts und Du diesen doppelt
    anklickst was der automatische Code - Designer macht um die Event - Callback - Geschichte ins rollen zu bringen. Dann hat man schon ne Menge zu Delegates
    gesehn.

    Jain. Der Witz bei Events ist, dass es ein paar entscheidende Unterschiede zu Delegates gibt. Du kannst die Liste der angemeldeten Methoden nicht direkt bearbeiten, sondern nur bestimmte Methoden an- oder abmelden. Und die Signatur ist vorgeschrieben.



  • lese gerade:

    Future solution 2: ParameterizedThreadStart
    In .NET 2.0, there is a new delegate, ParameterizedThreadStart, which takes a parameter of type object. You can create a thread using an instance of this delegate instead of just ThreadStart, and a new overload to Thread.Start allows you to specify the value to be passed to the new thread. This is simple, but only accepts a single parameter and isn't type-safe (just like the options when using thread pool threads). The earlier code could then be rewritten as: 
    
    [In some method or other]
    Thread t = new Thread (new ParameterizedThreadStart(FetchUrl));
    t.Start (myUrl);
    
    [And the actual method...]
    static void FetchUrl(object url)
    {
        // use url here, probably casting it to a known type before use
    }
    


  • geri schrieb:

    hi, warum geht das nicht?

    namespace ConsoleApplication1
    {
    	class ThreadTest
    	{
    		static void Main() 
    		{
    			ThreadStart threadDelegate = new ThreadStart(Work.DoWork);
    			Thread newThread = new Thread(threadDelegate);
    			newThread.Start("dingdong");
    		}
    	}
    
    	class Work 
    	{
    		public static void DoWork(object obj) 
    		{
    			Console.Out.WriteLine((string)obj);
    		}
    	}
    }
    

    Weil die Signatur von ThreadStart void foo() ist. Du brauchst nen ParameterizedThreadStart.



  • Optimizer schrieb:

    sclearscreen schrieb:

    ganz genau Delegates sind genau dies! 👍

    Nicht ganz. Bei einem Funktionszeiger muss die Anzahl der Parameter inklusive this zur Compile-Zeit feststehen, Delegates können mit und ohne this-Parameter aufgerufen werden. Ein weiterer sehr wesentlicher Unterschied ist, dass das this-Objekt nicht zur Aufrufzeit angegeben wird:

    IrgendwasDelegate myDelegate;
    myDelegate = myObject.myMethod;  // Man beachte, dass zur Zeit der Zuweisung das Zielobjekt feststeht!
    
    // 20 Stunden später
    
    myDelegate();
    // bei Funktionszeigern würde man jetzt das this-Objekt auswählen
    // myObject->myDelegate() // keine Ahnung, irgendwie so  :)
    

    Guck Dir mal an wenn Du nen Button auf dein Formular ziehts und Du diesen doppelt
    anklickst was der automatische Code - Designer macht um die Event - Callback - Geschichte ins rollen zu bringen. Dann hat man schon ne Menge zu Delegates
    gesehn.

    Jain. Der Witz bei Events ist, dass es ein paar entscheidende Unterschiede zu Delegates gibt. Du kannst die Liste der angemeldeten Methoden nicht direkt bearbeiten, sondern nur bestimmte Methoden an- oder abmelden. Und die Signatur ist vorgeschrieben.

    nu dann habe ich auch wieder was Neues gelernt! THX! 🙂



  • Weil die Signatur von ThreadStart void foo() ist. Du brauchst nen ParameterizedThreadStart.

    dachte das liegt daran das ich .net 1.1 habe! mit ParameterizedThreadStart solls bei mir auch gehn? mal testen...thx



  • geht doch nur für .net 2.0 😢



  • Tja, das wusst ich nicht. Wenn's in .Net 1 kein äquivalent zum ParameterizedThreadStart gibt, dann würde ich ein Instanz-Delegate verwenden und Datenelemente als Parameter auslesen.


Anmelden zum Antworten