Cześć. po uruchomieniu poniższego kodu dotyczącego ThreadPool w Visual Studio 2015 Pro w Windows 10
otrzymuję komunikat na załączonym obrazku.
może Ktoś już spotkał się z podobnym problemem, proszę o wskazówki jak to wyłączyć lub przywrócić Visual Studio 2015 do normalnego funkcjonowania ponieważ już nie mogę żadnego innego nowego projektu nawet uruchomić - ten komunikat trwale jak mniemam zawiesza funkcjonowanie Visual Studio. Pomocy !
oto poniżej cały kod programu konsolowego w C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//
using System.Threading;
//
namespace JM_3_463
{
class Program
{
static Random r = new Random();
static int ileWatkow = 10;
static double pi = 0;
//
static void Main(string[] args)
{
int czasPoczatkowy = Environment.TickCount;
//
//uruchamianieObliczenPi();
//
/*
ThreadStart ts = new ThreadStart(uruchamianieObliczenPi);
Thread t = new Thread(ts);
//t.IsBackground = true;
t.Priority = ThreadPriority.Highest;
t.Start();
//Thread.Sleep(100);
//t.Abort();
Console.WriteLine("Czy ten napis pojawi się przed otrzymaniem wyniku?");
t.Suspend();
Console.WriteLine("Naciśnij Enter aby kontynować działanie wątku...");
Console.ReadLine();
t.Resume();
*/
//
/*
//tworzenie watkow
//ThreadStart ts = new ThreadStart(uruchamianieObliczenPi);
ParameterizedThreadStart ts = new ParameterizedThreadStart(uruchamianieObliczenPi);
Thread[] tt = new Thread[ileWatkow];
for (int i = 0; i < ileWatkow; ++i)
{
tt[i] = new Thread(ts);
tt[i].Priority = ThreadPriority.Lowest;
tt[i].Start(i);
}
//czekanie na zakonczenie watkow
foreach (Thread t in tt)
{
t.Join();
Console.WriteLine("Zakończył działanie watek nr {0}", t.ManagedThreadId);
}
pi /= ileWatkow;
Console.WriteLine("Wszystkie wątki zakończyły działanie.\nUśrednione Pi={0}, błąd={1}", pi, Math.Abs(Math.PI - pi));
*/
//
//tworzenie ( puli ! ) watkow
ThreadPool.SetMaxThreads(30, 100);// JM-3-463
//
WaitCallback metodaWatku = new WaitCallback(uruchamianieObliczenPi);
//
for (int i = 0; i < ileWatkow; ++i)
{
ThreadPool.QueueUserWorkItem(metodaWatku, i);
}
//
//czekanie na zakonczenie watkow
int ileDostepnychWatkowWPuli = 0; //nieuzywane watki puli
int ileWszystkichWatkowWPuli = 0; //wszystkie watki puli
int ileDzialajacychWatkowPuli = 0; //uzywane watki puli
int tmp = 0;
do
{
ThreadPool.GetAvailableThreads(out ileDostepnychWatkowWPuli, out tmp);
ThreadPool.GetMaxThreads(out ileWszystkichWatkowWPuli, out tmp);
//
ileDzialajacychWatkowPuli = ileWszystkichWatkowWPuli - ileDostepnychWatkowWPuli;
//
//Console.Clear();
Console.WriteLine("Ilość aktywnych wątków puli: {0}", ileDzialajacychWatkowPuli);
Thread.Sleep(1000);
}
while (ileDzialajacychWatkowPuli > 0);
//
pi /= ileWatkow;
//
Console.WriteLine("Wszystkie wątki zakończyły działanie.\nUśrednione Pi={0}, błąd={1}", pi, Math.Abs(Math.PI - pi));
//
int czasKoncowy = Environment.TickCount;
int roznica = czasKoncowy - czasPoczatkowy;
Console.WriteLine("Czas obliczeń: " + (roznica).ToString());
//
Console.WriteLine("Naciśnij Enter aby kontynować działanie wątku...");
Console.ReadLine();
}
//
static double obliczPi(long ilośćPrób)
{
Random r=new Random(Program.r.Next() & DateTime.Now.Millisecond);
//
double x, y;
long ilośćTrafień = 0;
for (int i = 0; i < ilośćPrób; ++i)
{
if (i == ilośćPrób / 2)
{
/*lock ((object)Program.pi)
{
Console.WriteLine("Synchronizacja: watek nr {0} osiągnął półmetek", Thread.CurrentThread.ManagedThreadId);
}*/
/*Monitor.Enter((object)Program.pi);
try
{
Console.WriteLine("Synchronizacja: watek nr {0} osiągnął półmetek", Thread.CurrentThread.ManagedThreadId);
}
finally
{
Monitor.Exit((object)Program.pi);
}*/
}
x = r.NextDouble();
y = r.NextDouble();
if (x * x + y * y < 1) ++ilośćTrafień;
//Console.WriteLine("x={0}, y={1}", x, y);
}
return 4.0 * ilośćTrafień / ilośćPrób;
}
//
static void uruchamianieObliczenPi(object parametr)
{
try
{
int? indeks = parametr as int?;
//
long ilośćPrób = 10000000L / ileWatkow;
//long ilośćPrób = 1000000000L / ileWatkow;
Console.WriteLine("Uruchamianie obliczeń, watek nr {0}, indeks {1}...",
Thread.CurrentThread.ManagedThreadId, indeks!=null?indeks.ToString():"---");
//
double pi = obliczPi(ilośćPrób: ilośćPrób);
Program.pi += pi;
//
Console.WriteLine("Pi={0}, błąd={1}, wątek nr {2}, indeks {3}", pi, Math.Abs(Math.PI - pi),
Thread.CurrentThread.ManagedThreadId, indeks != null ? indeks.ToString() : "---");
}
catch (ThreadAbortException exc)
{
Console.WriteLine("Działanie wątku zostało przerwane (" + exc.Message + ")");
}
catch (Exception exc)
{
Console.WriteLine("Wyjątek (" + exc.Message + ")");
}
}
}
}