I want to start a number of threads based on the number of threads the computer running the program will have.
I tried doing switches but it seems that it can't end the threads.
This is my Main thread and doesn't work, it says the threads are out of context on the 2nd switch
Is there anything I can add or should I use a different method altogether?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Security.Principal;
namespace Yahtzee_DataMine
{
class Program
{
public static Random diceValue = new Random();
public static int numberOfDie = new int();
public static int numberOfSides = new int();
private static System.Object lockThis = new System.Object();
public static decimal percent = new decimal();
public static ConsoleColor oldColor = Console.ForegroundColor;
static void Main(string[] args)
{
while (true)
{
getInfo();
int processorCount = Environment.ProcessorCount;
Console.WriteLine(processorCount);
if (processorCount > 7) { processorCount = 7; }
switch (processorCount)
{
case 7:
Thread Rolls6 = new Thread(Rolling2);
Rolls6.Start();
goto case 6;
case 6:
Thread Rolls5 = new Thread(Rolling3);
Rolls5.Start();
goto case 5;
case 5:
Thread Rolls4 = new Thread(Rolling4);
Rolls4.Start();
goto case 4;
case 4:
Thread Rolls3 = new Thread(Rolling5);
Rolls3.Start();
goto case 3;
case 3:
Thread Rolls2 = new Thread(Rolling6);
Rolls2.Start();
goto case 1;
case 2:
case 1:
Thread Rolls1 = new Thread(Rolling7);
Rolls1.Start();
break;
}
while (true)
{
char quit = quit = Console.ReadKey().KeyChar;
if (quit == 'q')
{
Console.WriteLine("\rTerminated");
break;
}
}
switch (processorCount)
{
case 7:
Rolls6.abort();
goto case 6;
case 6:
Rolls5.abort();
goto case 5;
case 5:
Rolls4.abort();
goto case 4;
case 4:
Rolls3.abort();
goto case 3;
case 3:
Rolls2.abort();
goto case 1;
case 2:
case 1:
Rolls1.abort();
break;
}
}
}
public static void getInfo()
{
if (WindowsIdentity.GetCurrent().Owner.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) == false)
{
Console.WriteLine("You Are Not Running With Elevated Administrative Access.");
Console.WriteLine("Please Restart And Run Program With Administrative Access");
}
#region gettingNumberOfDie
while (true)
{
Console.WriteLine("How Many Die Would You Like To Roll? Type Q To Quit");
String howManyDie = Console.ReadLine();
try
{
int.TryParse(howManyDie, out numberOfDie);
if (numberOfDie < 2)
{
Console.WriteLine("Please Enter A Integer Greater Than 1");
continue;
}
break;
}
catch
{
Console.WriteLine("Please Enter A Number Or Press Q To Quit");
continue;
}
}
#endregion
#region gettingNumberOfSides
while (true)
{
Console.WriteLine("How Many Sides Do You Want Each Die To Have?");
String howManySides = Console.ReadLine();
try
{
int.TryParse(howManySides, out numberOfSides);
if (numberOfSides < 2)
{
Console.WriteLine("Please Enter A Integer Greater Than 1");
continue;
}
break;
}
catch
{
Console.WriteLine("Please Enter A Number Or Press Q To Quit");
continue;
}
}
#endregion
#region gettingPercent
int percentCounter = 1;
percent = (1m / (numberOfSides));
decimal percentMultiplier = percent;
while (percentCounter < numberOfDie)
{
percent = percent * percentMultiplier;
percentCounter++;
}
percent = percent * 100;
#endregion
Console.WriteLine("With " + numberOfDie + ", " + numberOfSides + " Sided Die, You Have An " + percent + '%' + " Chance of Getting A Yahtzee With Any Given Roll");
Console.WriteLine("Press Any Key To Commence");
Console.ReadKey();
}
static int seed = Environment.TickCount;
static readonly ThreadLocal<Random> random = new ThreadLocal<Random>(() => new Random(Interlocked.Increment(ref seed)));
public static int Rand()
{
return random.Value.Next(numberOfSides);
}
private static void Rolling1()
{
Console.WriteLine("Thread1 Started");
while (true)
{
#region rollS
Stopwatch rollTime = new Stopwatch();
rollTime.Start();
UInt64 numberOfRolls = 0;
while (true)
{
numberOfRolls++;
int counter = 0;
int[] valuesOfRoll = new int[numberOfDie];
#region Roll
while (counter < numberOfDie)
{
valuesOfRoll.SetValue((Rand() + 1), counter);
counter++;
}
#region isItYahtzee?
Boolean isItYahtzee = true;
int counterYaht = 1;
while (counterYaht < numberOfDie)
{
if (valuesOfRoll[counterYaht] != valuesOfRoll[0])
{
isItYahtzee = false;
counterYaht++;
break;
}
else
{
counterYaht++;
continue;
}
}
if ((numberOfRolls % 100000000) == 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Thread1 has rolled " + numberOfRolls);
Console.ForegroundColor = oldColor;
}
#endregion
#region ifYahtzee
if (isItYahtzee == true)
{
rollTime.Stop();
string time = rollTime.Elapsed.ToString();
string timeSec = rollTime.Elapsed.TotalSeconds.ToString();
string linesA = numberOfDie + "," + numberOfSides + "," + (numberOfDie * numberOfSides) + "," + numberOfRolls + "," + percent + "%" + "," + (percent * numberOfRolls) + "," + time + "," + timeSec + "," + (numberOfRolls / rollTime.Elapsed.TotalSeconds);
string linesB = (numberOfRolls).ToString();
lock (lockThis)
{
System.IO.StreamWriter fileA = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\All.txt", true);
fileA.WriteLine(linesA);
fileA.Close();
System.IO.StreamWriter fileB = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\Avg_" + numberOfDie + "X" + numberOfSides + ".txt", true);
fileB.WriteLine(linesB);
fileB.Close();
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(numberOfRolls + " File Has Been Successfully Save By Thread 1");
Console.ForegroundColor = oldColor;
numberOfRolls = 0;
break;
}
}
#endregion
#endregion
#endregion
}
}
private static void Rolling2()
{
Console.WriteLine("Thread2 Started");
while (true)
{
#region rollS
Stopwatch rollTime = new Stopwatch();
rollTime.Start();
UInt64 numberOfRolls = 0;
while (true)
{
numberOfRolls++;
int counter = 0;
int[] valuesOfRoll = new int[numberOfDie];
#region Roll
while (counter < numberOfDie)
{
valuesOfRoll.SetValue((Rand() + 1), counter);
counter++;
}
#region isItYahtzee?
Boolean isItYahtzee = true;
int counterYaht = 1;
while (counterYaht < numberOfDie)
{
if (valuesOfRoll[counterYaht] != valuesOfRoll[0])
{
isItYahtzee = false;
counterYaht++;
break;
}
else
{
counterYaht++;
continue;
}
}
if ((numberOfRolls % 100000000) == 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Thread2 has rolled " + numberOfRolls);
Console.ForegroundColor = oldColor;
}
#endregion
#region ifYahtzee
if (isItYahtzee == true)
{
rollTime.Stop();
string time = rollTime.Elapsed.ToString();
string timeSec = rollTime.Elapsed.TotalSeconds.ToString();
string linesA = numberOfDie + "," + numberOfSides + "," + (numberOfDie * numberOfSides) + "," + numberOfRolls + "," + percent + "%" + "," + (percent * numberOfRolls) + "," + time + "," + timeSec + "," + (numberOfRolls / rollTime.Elapsed.TotalSeconds);
string linesB = numberOfRolls.ToString();
lock (lockThis)
{
System.IO.StreamWriter fileA = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\All.txt", true);
fileA.WriteLine(linesA);
fileA.Close();
System.IO.StreamWriter fileB = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\Avg_" + numberOfDie + "X" + numberOfSides + ".txt", true);
fileB.WriteLine(linesB);
fileB.Close();
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(numberOfRolls + " File Has Been Successfully Save By Thread 2");
Console.ForegroundColor = oldColor;
numberOfRolls = 0;
break;
}
}
#endregion
#endregion
#endregion
}
}
private static void Rolling3()
{
Console.WriteLine("Thread3 Started");
while (true)
{
#region rollS
Stopwatch rollTime = new Stopwatch();
rollTime.Start();
UInt64 numberOfRolls = 0;
while (true)
{
numberOfRolls++;
int counter = 0;
int[] valuesOfRoll3 = new int[numberOfDie];
#region Roll
while (counter < numberOfDie)
{
valuesOfRoll3.SetValue((Rand() + 1), counter);
counter++;
}
#region isItYahtzee?
Boolean isItYahtzee = true;
int counterYaht = 1;
while (counterYaht < numberOfDie)
{
if (valuesOfRoll3[counterYaht] != valuesOfRoll3[0])
{
isItYahtzee = false;
counterYaht++;
break;
}
else
{
counterYaht++;
continue;
}
}
#endregion
if ((numberOfRolls % 100000000) == 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Thread3 has rolled " + numberOfRolls);
Console.ForegroundColor = oldColor;
}
#region ifYahtzee
if (isItYahtzee == true)
{
rollTime.Stop();
string time = rollTime.Elapsed.ToString();
string timeSec = rollTime.Elapsed.TotalSeconds.ToString();
string linesA = numberOfDie + "," + numberOfSides + "," + (numberOfDie * numberOfSides) + "," + numberOfRolls + "," + percent + "%" + "," + (percent * numberOfRolls) + "," + time + "," + timeSec + "," + (numberOfRolls / rollTime.Elapsed.TotalSeconds);
string linesB = numberOfRolls.ToString();
lock (lockThis)
{
System.IO.StreamWriter fileA = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\All.txt", true);
fileA.WriteLine(linesA);
fileA.Close();
System.IO.StreamWriter fileB = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\Avg_" + numberOfDie + "X" + numberOfSides + ".txt", true);
fileB.WriteLine(linesB);
fileB.Close();
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(numberOfRolls + " File Has Been Successfully Save By Thread 3");
Console.ForegroundColor = oldColor;
numberOfRolls = 0;
break;
}
}
#endregion
#endregion
#endregion
}
}
private static void Rolling4()
{
Console.WriteLine("Thread4 Started");
while (true)
{
#region rollS
Stopwatch rollTime = new Stopwatch();
rollTime.Start();
UInt64 numberOfRolls = 0;
while (true)
{
numberOfRolls++;
int counter = 0;
int[] valuesOfRoll = new int[numberOfDie];
#region Roll
while (counter < numberOfDie)
{
valuesOfRoll.SetValue((Rand() + 1), counter);
counter++;
}
#region isItYahtzee?
Boolean isItYahtzee = true;
int counterYaht = 1;
while (counterYaht < numberOfDie)
{
if (valuesOfRoll[counterYaht] != valuesOfRoll[0])
{
isItYahtzee = false;
counterYaht++;
break;
}
else
{
counterYaht++;
continue;
}
}
#endregion
if ((numberOfRolls % 100000000) == 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Thread4 has rolled " + numberOfRolls);
Console.ForegroundColor = oldColor;
}
#region ifYahtzee
if (isItYahtzee == true)
{
rollTime.Stop();
string time = rollTime.Elapsed.ToString();
string timeSec = rollTime.Elapsed.TotalSeconds.ToString();
string linesA = numberOfDie + "," + numberOfSides + "," + (numberOfDie * numberOfSides) + "," + numberOfRolls + "," + percent + "%" + "," + (percent * numberOfRolls) + "," + time + "," + timeSec + "," + (numberOfRolls / rollTime.Elapsed.TotalSeconds);
string linesB = numberOfRolls.ToString();
lock (lockThis)
{
System.IO.StreamWriter fileA = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\All.txt", true);
fileA.WriteLine(linesA);
fileA.Close();
System.IO.StreamWriter fileB = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\Avg_" + numberOfDie + "X" + numberOfSides + ".txt", true);
fileB.WriteLine(linesB);
fileB.Close();
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(numberOfRolls + " File Has Been Successfully Save By Thread 4");
Console.ForegroundColor = oldColor;
numberOfRolls = 0;
break;
}
}
#endregion
#endregion
#endregion
}
}
private static void Rolling5()
{
Console.WriteLine("Thread5 Started");
while (true)
{
#region rollS
Stopwatch rollTime = new Stopwatch();
rollTime.Start();
UInt64 numberOfRolls = 0;
while (true)
{
numberOfRolls++;
int counter = 0;
int[] valuesOfRoll = new int[numberOfDie];
#region Roll
while (counter < numberOfDie)
{
valuesOfRoll.SetValue((Rand() + 1), counter);
counter++;
}
#region isItYahtzee?
Boolean isItYahtzee = true;
int counterYaht = 1;
while (counterYaht < numberOfDie)
{
if (valuesOfRoll[counterYaht] != valuesOfRoll[0])
{
isItYahtzee = false;
counterYaht++;
break;
}
else
{
counterYaht++;
continue;
}
}
#endregion
if ((numberOfRolls % 100000000) == 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Thread5 has rolled " + numberOfRolls);
Console.ForegroundColor = oldColor;
}
#region ifYahtzee
if (isItYahtzee == true)
{
rollTime.Stop();
string time = rollTime.Elapsed.ToString();
string timeSec = rollTime.Elapsed.TotalSeconds.ToString();
string linesA = numberOfDie + "," + numberOfSides + "," + (numberOfDie * numberOfSides) + "," + numberOfRolls + "," + percent + "%" + "," + (percent * numberOfRolls) + "," + time + "," + timeSec + "," + (numberOfRolls / rollTime.Elapsed.TotalSeconds);
string linesB = numberOfRolls.ToString();
lock (lockThis)
{
System.IO.StreamWriter fileA = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\All.txt", true);
fileA.WriteLine(linesA);
fileA.Close();
System.IO.StreamWriter fileB = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\Avg_" + numberOfDie + "X" + numberOfSides + ".txt", true);
fileB.WriteLine(linesB);
fileB.Close();
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(numberOfRolls + " File Has Been Successfully Save By Thread 5");
Console.ForegroundColor = oldColor;
numberOfRolls = 0;
break;
}
}
#endregion
#endregion
#endregion
}
}
private static void Rolling6()
{
Console.WriteLine("Thread6 Started");
while (true)
{
#region rollS
Stopwatch rollTime = new Stopwatch();
rollTime.Start();
UInt64 numberOfRolls = 0;
while (true)
{
numberOfRolls++;
int counter = 0;
int[] valuesOfRoll = new int[numberOfDie];
#region Roll
while (counter < numberOfDie)
{
valuesOfRoll.SetValue((Rand() + 1), counter);
counter++;
}
#region isItYahtzee?
Boolean isItYahtzee = true;
int counterYaht = 1;
while (counterYaht < numberOfDie)
{
if (valuesOfRoll[counterYaht] != valuesOfRoll[0])
{
isItYahtzee = false;
counterYaht++;
break;
}
else
{
counterYaht++;
continue;
}
}
#endregion
if ((numberOfRolls % 100000000) == 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Thread6 has rolled " + numberOfRolls);
Console.ForegroundColor = oldColor;
}
#region ifYahtzee
if (isItYahtzee == true)
{
rollTime.Stop();
string time = rollTime.Elapsed.ToString();
string timeSec = rollTime.Elapsed.TotalSeconds.ToString();
string linesA = numberOfDie + "," + numberOfSides + "," + (numberOfDie * numberOfSides) + "," + numberOfRolls + "," + percent + "%" + "," + (percent * numberOfRolls) + "," + time + "," + timeSec + "," + (numberOfRolls / rollTime.Elapsed.TotalSeconds);
string linesB = numberOfRolls.ToString();
lock (lockThis)
{
System.IO.StreamWriter fileA = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\All.txt", true);
fileA.WriteLine(linesA);
fileA.Close();
System.IO.StreamWriter fileB = new System.IO.StreamWriter(Directory.GetCurrentDirectory().ToString() + "\\Avg_" + numberOfDie + "X" + numberOfSides + ".txt", true);
fileB.WriteLine(linesB);
fileB.Close();
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(numberOfRolls + " File Has Been Successfully Save By Thread 6");
Console.ForegroundColor = oldColor;
numberOfRolls = 0;
break;
}
}
#endregion
#endregion
#endregion
}
}