Was mache ich bei Thread.Suspend und Resume falsch?



  • Hallo,

    in meinem Buch steht folgender Code

    class Program
        {
            static void Main(string[] args)
            {
                ThreadStart tS = new ThreadStart(MyProc);
                Thread myT = new Thread(tS);
                myT.Start();
                int i = 0;
                while (true)
                {
                    ++i;
                    Console.Write(".");
                    if (i == 200)
                    {
                        Console.WriteLine("Sek wird angehalten");
                        myT.Suspend();
                    }
                    if (i == 1000)
                    {
                        Console.WriteLine("Hauptthread beendet - Sec-Thread wird gestartet");
                        break;
                    }
                }
                myT.Resume();
                Console.ReadLine();
            }
    
            static void MyProc()
            {
                int i = 0;
                while(true)
                {
                    ++i;
                    Console.Write("S");
                    if(i==1000)
                        break;
                }
    
                }
            }
    

    allerdings bleibt die komplette abarbeitung nach dem suspend() stehen (auch hauptthread läuft nicht weiter)

    Fehlermeldung bekomme ich keine, was mache ich also falsch??



  • sdsads schrieb:

    Hallo,
    Fehlermeldung bekomme ich keine, was mache ich also falsch??

    1. Du benutzt eine Funktion (suspend) die als deprecated markiert ist. Das heisst die Funktion ist veraltet und soll nicht mehr benutzt werden. Sie ist nur noch zwecks Abwärtskompatibilität vorhanden.

    2. Du hast die Dokumentation dazu nicht gelesen, da steht nämlich folgendes:

    http://msdn2.microsoft.com/en-us/library/system.threading.thread.suspend(VS.71).aspx

    Ausschnitt:

    CAUTION Do not use the Suspend and Resume methods to synchronize the activities of threads. You have no way of knowing what code a thread is executing when you suspend it. If you suspend a thread while it holds locks during a security permission evaluation, other threads in the AppDomain might be blocked. If you suspend a thread while it is executing a class constructor, other threads in the AppDomain that attempt to use that class are blocked. Deadlocks can occur very easily.

    Auch wenn ich es nciht ausprobiert habe, ich denke mal die Console-Ausgabe im 2ten Thread erzeugt das deadlock...



  • hm...und wie müsste der code dann richtig aussehen?
    Wieso wird das dann in dem Buch beschrieben, wo es um C# 2.0 geht?



  • sdasd schrieb:

    hm...und wie müsste der code dann richtig aussehen?
    Wieso wird das dann in dem Buch beschrieben, wo es um C# 2.0 geht?

    Kommt drauf an was Du machen willst. Grundsätzlich ist es eine schlechte Idee einen Thread von aussen zu suspenden, weil du damit beliebige deadlock-situationen herbeifühen kannst( Wie in der Doku beschrieben).

    Ka warum sowas in einem Buch steht, da müsste man den Kontext des Buches kennen...



  • das is das VisualC#2005 Buch von Galileo Computing (als free version kannst dir das ja mal anschauen)

    Naja, dann les ich erstmal weiter, vielleicht wird später noch genauer auf diese möglichkeiten eingegangen!



  • Sieht so aus als würde das Buch auf Net 1.1 basieren... In Net 1.1 waren die Funktionen noch nicht deprecated.

    Letzten Endes aber ist es egal was das Buch schreibt, Suspend sollte man halt so nicht verwenden.


Anmelden zum Antworten