Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1895 | Besucher online: 145
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Multithreading, Variable für 2 Threads, Lock Beispiel


Autor: Jimpanse
Sprache: C#
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 10675
  
Kick it on dotnet-kicks.de  

Beschreibung:

Hier wird eine Variable von zwei Threads benutzt und mittels lock für den jeweiligen Thread gesperrt, damit die Benutzung der Variable Threadsafe ist.

Der zweite Thread geht eine Liste von Zahlen durch und schreibt diese mit einer Scheife in eine Variable, diese Variable wird vom Mainthread verglichen und ggf. in der Console ausgegeben. Sobald sich current_process ändert, wird diese wieder in der Console ausgegeben.

Ich habe beide cs-dateien in den Code eingefügt, ihr könnt die Dateien jeweils kompilieren, es läuft ohne Änderung einwandfrei.

Hoffe das hilft Jemanden.

Gruß
Jim


Abgelegt unter: Multithreading, Variable für 2 Threads, Lock Beispiel.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
==== Program.cs ====

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;

namespace threads_syncen
{
    public class Program
    {

        [STAThread]
        public static void Main()
        {           

            Console.WriteLine("==================Threads==================");

            int puffer = 0;
            Class1 demo = new Class1();

            Thread auftrag_bearbeiten = new Thread(new ThreadStart(demo.auftrag));
            //auftrag_bearbeiten.Priority = ThreadPriority.AboveNormal;//so kann man auch bewirken das der Thread mehr CPUZeit bekommt und somit ruckzuck der Bool auf True gesetzt wird
            auftrag_bearbeiten.Start();

            //damit der gerade gestartete Thread auch die Zeit hat den Bool zu ändern
            Thread.Sleep(10);

            while (Class1.auftrag_laeuft == true)
            {
                lock (demo)//Object wird gesperrt, damit der Mainthread auf current_process sicher zugreifen kann
                {
                    if (puffer != Class1.current_process)
                    {
                        Console.WriteLine(Class1.current_process);
                        puffer = Class1.current_process;
                    }
                }
            }
            //damit sich die Console nicht sofort schließt
            Console.WriteLine("\n" + "Taste druecken um zu beenden");
            Console.ReadKey();

        }
    }
}



==== Class1.cs ====

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace threads_syncen
{
    
    public class Class1
    {
        //der Aktuelle Auftrag
        public static int current_process = 0;
        public static bool auftrag_laeuft = false;
        //Zahlen die durchgegangen werden und vom MainThread verglichen werden
        int[] nummern = new int[] {101,102,103,104,105,106,107,108,109,110,111,112,113};

        public void auftrag()
        {
            auftrag_laeuft = true;

            for (int i = 0; i < nummern.Length; i++)
            {
                
                current_process_setzen(nummern[i]);

                //do some Work
                Thread.Sleep(400);
            }
            auftrag_laeuft = false;

        }

        //Methode um current_process zu sperren fuer den Thread
        void current_process_setzen(int nummer)
        {
            lock (this)
            {
                current_process = nummer;
            }
        }

    }
}

Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)



Diese Snippets könnten für Sie interessant sein:

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.