コード例 #1
0
        // hint: no lock deadlock, but why ?
        public void OnSharedRessource()
        {
            var obj1 = new object();
            var obj2 = new object();

            var haveBeenCompletedFirstLongTask  = false;
            var haveBeenCompletedSecondLongTask = false;

            var jobFactory = new SimpleJob();

            void RunLongTask(object locker1, object locker2, ref bool haveBeenCompleted)
            {
                lock (locker1)
                {
                    jobFactory.DoCorseGrainedJob(1000);
                    lock (locker2)
                    {
                        jobFactory.DoCorseGrainedJob(1000);
                        haveBeenCompleted = true;
                    }
                }
            }

            var thread1 = new Thread(() => RunLongTask(obj1, obj2, ref haveBeenCompletedFirstLongTask));
            var thread2 = new Thread(() => RunLongTask(obj2, obj1, ref haveBeenCompletedSecondLongTask));

            thread1.Start();
            thread2.Start();

            thread1.Join();
            thread2.Join();

            Assert.True(haveBeenCompletedFirstLongTask);
            Assert.True(haveBeenCompletedSecondLongTask);
        }
コード例 #2
0
        public void OnSharedRessource()
        {
            var obj1 = new object();
            var obj2 = new object();

            Task[] tasks = new Task[2];

            var haveBeenCompletedFirstLongTask  = false;
            var haveBeenCompletedSecondLongTask = false;

            var jobFactory = new SimpleJob();

            void RunLongTask(object locker1, object locker2, ref bool haveBeenCompleted)
            {
                lock (locker1)
                {
                    jobFactory.DoCorseGrainedJob(1000);
                    lock (locker2)
                    {
                        jobFactory.DoCorseGrainedJob(1000);
                        haveBeenCompleted = true;
                    }
                }
            }

            tasks[0] = new Task(() => RunLongTask(obj1, obj2, ref haveBeenCompletedFirstLongTask));
            tasks[1] = new Task(() => RunLongTask(obj2, obj1, ref haveBeenCompletedSecondLongTask));

            tasks[0].Start();
            tasks[1].Start();

            // FILL_ME_IN

            Assert.True(haveBeenCompletedFirstLongTask);
            Assert.True(haveBeenCompletedSecondLongTask);
        }
コード例 #3
0
        public void CreateThread()
        {
            var jobFactory       = new SimpleJob();
            var haveBeenExecuted = false;
            // Execute the job in a separate thread and be sure it has runned successfully
            var thread = new Thread(() =>
            {
                jobFactory.DoCorseGrainedJob(5000);
                haveBeenExecuted = true;
            });

            thread.Start();
            thread.Join();
            // Missing something ?
            // Assert
            Assert.True(haveBeenExecuted);
        }
コード例 #4
0
        // Hint: what do you know about cancellation into TPL ?
        //       have you code a class that can help you ?
        // Extra: factorize your idea into an object ;)
        // We may use it again soon !!!
        public void OnCancellingThread()
        {
            var     jobFactory       = new SimpleJob();
            var     haveBeenExecuted = false;
            IResult result;
            // Execute the job in a separate thread and be sure it has runned successfully
            var thread = new Thread(() =>
            {
                jobFactory.DoCorseGrainedJob(5000);
                haveBeenExecuted = true;
            });

            thread.Start();
            thread.Interrupt();
            result = FILL_ME_IN;
            Assert.False(haveBeenExecuted);
            Assert.True(result.HasError);
            Assert.IsType <OperationCanceledException>(result.InternalError);
        }