Πρέπει να υποστηρίξω μια εφαρμογή επιφάνειας εργασίας που είχε εφαρμοστεί από άλλον προγραμματιστή. Η εφαρμογή έχει κάποιο «μαγικό» κωδικό και το TPL δεν λειτουργεί μετά την κλήση.
Νομίζω ότι κάποιος απέκλεισε τη λειτουργία του ThreadPool, αλλά δεν έχω ιδέα πώς να το βρω. Το ερώτημα είναι: Τι συμβαίνει στη μέθοδο VeryLargeBlackBoxMethod()
; Πώς μπορώ να μάθω ποιος είναι ο λάθος κωδικός;
[STAThread]
public static void Main()
{
var testTimer = new System.Threading.Timer((s) => { Console.WriteLine("This code never run"); });
testTimer.Change(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
PrintAvailableThreads();
// ThreadPool can`t provide a new Task after this method executing
VeryLargeBlackBoxMethod();
PrintAvailableThreads();
Task.Factory.StartNew(() => { Console.WriteLine("This code never run too"); });
ThreadPool.QueueUserWorkItem((p) => { Console.WriteLine("And this code newer run"); });
var thread = new Thread(() => { Console.WriteLine("But this code work"); });
thread.Start();
Console.ReadLine();
}
private static void PrintAvailableThreads()
{
var work = 0;
var completionThreads = 0;
ThreadPool.GetAvailableThreads(out work, out completionThreads);
Console.WriteLine("worker threads {0}, completionThreads {1}", work, completionThreads);
}
// Console output:
// worker threads 32767, completionThreads 1000
// worker threads 32762, completionThreads 1000
// But this code work