我想根据运行程序的计算机所具有的线程数来启动一些线程。我可以用交换机启动线程,但不能结束它们
我试着做交换机,但似乎它不能结束线程。
这是我的主线程并不起作用,它说的线程是断章取义的第二开关
上有什么我可以添加或者我应该用完全不同的方法?
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
}
}
看一看为什么'abort'是棘手.. http://stackoverflow.com/questions/1559255/whats-wrong-with-using-thread-abort –
Rolling1(和其他)的方法是做什么的? – alexm
它滚动一些死亡,直到它获得所有相同的数字。 – DominiUmbra