示例#1
0
        public void ShouldGlobalRunOnceAndWaitForReleaseLock()
        {
            var key         = Utility.NewPassword();
            var isFirstTime = true;

            var actionExecutionCount = 0;
            var locker2 = new object();
            var locker  = new object();

            Mock.Get(lockService).Setup(p => p.Lock(key, key, It.IsAny <TimeSpan>()))
            .ReturnsAsync(() =>
            {
                lock (locker)
                {
                    var isFirst = isFirstTime;
                    isFirstTime = false;
                    return(isFirst);
                }
            });
            Mock.Get(lockService).Setup(p => p.Query <string>(key))
            .ReturnsAsync(() => (actionExecutionCount == 0, key));

            var tasks = System.Linq.Enumerable.Range(0, 10).Select(p => lockService.GlobalRunOnceOrWaitFor(key, Action)).ToArray();

            Task.WaitAll(tasks);

            Assert.AreEqual(1, actionExecutionCount);

            void Action()
            {
                lock (locker2)
                {
                    Task.Delay(10).Wait();
                    actionExecutionCount++;
                }
            }
        }