WinFuture-Forum.de: [gelöst]c# Bzw .net Bug Or Feature? - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[gelöst]c# Bzw .net Bug Or Feature? oder bin ich blind?


#1 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 23. März 2006 - 23:01

Folgender Code, den ich einfach nicht verstehen will.

Zur Erklärung:
this.threads ist ein Thread-Array.
In einer for-Schleife gehe ich dieses Array durch, instanziiere einen Delegaten durch eine anonyme Methode und starte den Thread.

Und jetzt zu der komischen Sache.

Innerhalb des Delegaten ist i eins höher als "außen".
Aber warum? Der Thread wird doch innerhalb der Schleife gestartet.
Auch wenn in dem Array nur ein Element ist, ist i innerhalb 1 und nicht 0.

			
			this.threads = new Thread[count];
			for (int i = 0; i < this.threads.Length; i++)
			{
				...
				this.threads[i] = new Thread(delegate()
				{
					// Bug? i ist hier eins höher als außerhalb 0.o
					i--;
				});

				this.threads[i].Start();
			}


Vielleicht hat ja einer von euch eine logische Erklärung dafür...

Dieser Beitrag wurde von Witi bearbeitet: 24. März 2006 - 14:49

0

Anzeige



#2 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 23. März 2006 - 23:06

In dem Moment, wo der Thread erstellt wird, wird er vorne an das Thread-Array angehängt?
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#3 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 24. März 2006 - 08:24

Ich gehe das anfangs "leere" Array von 0 bis n durch und instanziiere ein Thread-Objekt.

Ich habe mal eine kleine Test-Klasse geschrieben, die das verdeutlichen soll:
using System;
using System.Threading;

public class Test
{
	public static void Main()
	{
		Thread[] threads = new Thread[1];
		for (int i = 0; i < threads.Length; i++)
		{
			Console.WriteLine(i + " außen");
			threads[i] = new Thread(delegate()
			{
				Thread.Sleep(100);
				Console.WriteLine(i + " innen");
			});

			threads[i].Start();
		}
	}
}

Wenn ich eine kurze Pause in dem Thread einlege, ist die Ausgabe immer(!!):
0 außen
1 innen

Ohne Pause ist es zu ~90% 0 0. Bei mir kam nur einmal 0 1 raus.

Dieser Beitrag wurde von Witi bearbeitet: 24. März 2006 - 08:25

0

#4 Mitglied ist offline   Talla 

  • Gruppe: aktive Mitglieder
  • Beiträge: 225
  • Beigetreten: 24. Februar 04
  • Reputation: 0
  • Wohnort:Esslingen

geschrieben 24. März 2006 - 13:43

Ja ist doch normal, deine Schleife und deine Ausgabe laufen doch in getrennten Threads und beeinflussen sich nicht mehr gegenseitig. Sprich du kommst an die Stelle, erzeugst deinen Thread, wartest da drin mit Thread.Sleep(). Dein äußerer Thread mit der Schleife läuft aber weiter und du erhöst i um 1. und dann läuft dein innerer Thread weiter und sieht natürlich die um 1 höhere Laufzeitvariable.
Heimat ist nicht immer dort, wo wir zur Welt kamen - Heimat ist wo wir lieben. *Ehm Welk
0

#5 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 24. März 2006 - 14:48

Danke Talla, das deckt sich ungefähr mit meiner Feststellung, nachdem ich da mit einem Debugger rangegangen bin.

Verwirrt einen anfangs schon, da die Zählvariable ja "eigentlich" schon nicht mehr existiert, nachdem die um eins hochgezählt wird und man aus der for-schleife springt. Tja...aber neuen Thread gibt's die noch.
0

#6 Mitglied ist offline   Talla 

  • Gruppe: aktive Mitglieder
  • Beiträge: 225
  • Beigetreten: 24. Februar 04
  • Reputation: 0
  • Wohnort:Esslingen

geschrieben 24. März 2006 - 15:37

Das ist es ja, du springst nicht aus der for Schleife. Die Lebenzeit der Variablen aufn Stack richtet sich ja nach dem Scope in dem du bist, und du greifst innerhalb der Schleife darauf zu, also ist auch i noch vorhanden und kann ausgelesen werden, auch wenn die Schleife an sich nicht mehr läuft. Außerhalb der Schleife dürftest du aber aus dem Thread auch nicht mehr auf i zugreifen können.
Heimat ist nicht immer dort, wo wir zur Welt kamen - Heimat ist wo wir lieben. *Ehm Welk
0

#7 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 24. März 2006 - 15:41

Du hast kein Synchronized-Attribut gesetzt? Autsch! Dann musst du natürlich i als synchronized deklarieren.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0