public void InterlockedTest() { int threads = 4; var tasks = new ThreadTaskQueue(threads); tasks.UseSystemThreadPool = false; for (int thread = 0; thread < threads; thread++) { tasks.Add(() => { int count = 100 * 1000 * 1000; for (int i = 0; i < count; i++) { Interlocked.Increment(ref Value); } for (int i = 0; i < count; i++) { Interlocked.Decrement(ref Value); } }); } tasks.WaitForAllTasksCompleted(); Assert.Equal(0, Value); }
public void MultiThreadingTest() { var account = TestHelper.GetTestAccount(); var component = account.CreateRandomComponentControl(); var unitTest = component.GetOrCreateUnitTestControl("UnitTest." + Guid.NewGuid()); var tasks = new ThreadTaskQueue(10); var random = new Random(); Response firstError = null; for (int i = 0; i < 20; i++) { tasks.Add(() => { int value = 0; lock (tasks) { value = random.Next(100); } Response response = null; if (value > 50) { response = unitTest.SendResult(UnitTestResult.Success, TimeSpan.FromDays(1)); } else { response = unitTest.SendResult(UnitTestResult.Alarm, TimeSpan.FromDays(1)); } if (response.Success == false && firstError == null) { firstError = response; } }); } tasks.WaitForAllTasksCompleted(); account.GetClient().Flush(); account.SaveAllCaches(); if (firstError != null) { throw new Exception(firstError.ErrorMessage); } var actualDate = DateTime.Now.AddMinutes(30); var events = account.GetClient().ApiService.GetEvents(new GetEventsData() { OwnerId = unitTest.Info.Id, Category = EventCategory.UnitTestStatus, From = actualDate }).Data; Assert.Equal(1, events.Count);// должно быть только 1 актуальное событие }