// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.Threading; interface IGen { void Target(object p); } struct Gen : IGen { public void Target(object p) { //dummy line to avoid warnings Test.Eval(typeof(U)!=p.GetType()); if (Test.Xcounter>=Test.nThreads) { ManualResetEvent evt = (ManualResetEvent) p; evt.Set(); } else { Interlocked.Increment(ref Test.Xcounter); } } public static void ThreadPoolTest() { ManualResetEvent evt = new ManualResetEvent(false); IGen obj = new Gen(); TimerCallback tcb = new TimerCallback(obj.Target); Timer timer = new Timer(tcb,evt,Test.delay,Test.period); evt.WaitOne(); timer.Dispose(); Test.Eval(Test.Xcounter>=Test.nThreads); Test.Xcounter = 0; } } public class Test { public static int delay = 0; public static int period = 2; public static int nThreads = 5; public static int counter = 0; public static int Xcounter = 0; public static bool result = true; public static void Eval(bool exp) { counter++; if (!exp) { result = exp; Console.WriteLine("Test Failed at location: " + counter); } } public static int Main() { Gen.ThreadPoolTest(); Gen.ThreadPoolTest(); Gen.ThreadPoolTest(); Gen.ThreadPoolTest(); Gen.ThreadPoolTest(); if (result) { Console.WriteLine("Test Passed"); return 100; } else { Console.WriteLine("Test Failed"); return 1; } } }