public void TestSendOrPostCallbackSyncThreadPoolWorkItem()
        {
            int value = 0;

            System.Threading.SendOrPostCallback act = (s) =>
            {
                Interlocked.Increment(ref value);
            };

            var item = new SendOrPostCallbackSyncThreadPoolWorkItem(act, null);

            bool waitFinished = false;
            int  startedFlag  = 0;

            Task.Run(() =>
            {
                Interlocked.Exchange(ref startedFlag, 1);
                item.Wait();
                Volatile.Write(ref waitFinished, true);
            });

            TimingAssert.IsTrue(5000, () => Volatile.Read(ref startedFlag) == 1);
            Thread.Sleep(100);
            Assert.AreEqual(0, value);
            Assert.AreEqual(false, waitFinished);

            item.Run(false, false);

            TimingAssert.AreEqual(5000, 1, () => Volatile.Read(ref value));
            TimingAssert.AreEqual(5000, true, () => Volatile.Read(ref waitFinished));
        }
        public void TestSendOrPostCallbackSyncThreadPoolWorkItemExceptions()
        {
            System.Threading.SendOrPostCallback act = (s) =>
            {
                throw new Exception();
            };

            var item = new SendOrPostCallbackSyncThreadPoolWorkItem(act, null);

            Task.Delay(1000).ContinueWith(t => item.Run(false, false));

            item.Wait();
        }