public void DestructionTestModelInitialisation() { // we run this a few (100) times because threading isn't reliable ;p // each time (on a fresh model), we prepare a slew (20) threads - each eager to serialize one of two available types. // They all wait on a single gate, and then the fight begins! We track any failures, and Join all the threads // back together. var a = new ModelWithNonTrivialProperties() { J = new Dictionary<string, int> { { "abc", 123 } }, D = new byte[] { 0, 1, 2, 3, 4 }, G = new List<decimal> { 1, 2, 3, 4, 5 }, H = new Dictionary<int, AnotherType> { { 1, new AnotherType { A = 456 } } }, I = new AnotherType { B = "def" } }; var b = new AnotherType() { A = 123 }; for (int i = 0; i < 100; i++) { ManualResetEvent allGo = new ManualResetEvent(false); var model = TypeModel.Create(); model.AutoCompile = true; object starter = new object(); int waiting = 20; int failures = 0; Exception firstException = null; Thread[] threads = new Thread[20]; for (int j = 0; j < 10; j++) { threads[2 * j] = new Thread(() => { try { if (Interlocked.Decrement(ref waiting) == 0) allGo.Set(); allGo.WaitOne(); model.Serialize(Stream.Null, a); } catch (Exception ex) { Interlocked.CompareExchange(ref firstException, ex, null); Interlocked.Increment(ref failures); } }); threads[(2 * j) + 1] = new Thread(() => { try { if (Interlocked.Decrement(ref waiting) == 0) allGo.Set(); allGo.WaitOne(); model.Serialize(Stream.Null, b); } catch (Exception ex) { Interlocked.CompareExchange(ref firstException, ex, null); Interlocked.Increment(ref failures); } }); } for (int j = 0; j < threads.Length; j++) threads[j].Start(); for (int j = 0; j < threads.Length; j++) threads[j].Join(); Assert.IsNull(firstException); Assert.AreEqual(0, Interlocked.CompareExchange(ref failures, 0, 0)); } }
public void DestructionTestModelInitialisation() { // we run this a few (100) times because threading isn't reliable ;p // each time (on a fresh model), we prepare a slew (20) threads - each eager to serialize one of two available types. // They all wait on a single gate, and then the fight begins! We track any failures, and Join all the threads // back together. var a = new ModelWithNonTrivialProperties() { J = new Dictionary <string, int> { { "abc", 123 } }, D = new byte[] { 0, 1, 2, 3, 4 }, G = new List <decimal> { 1, 2, 3, 4, 5 }, H = new Dictionary <int, AnotherType> { { 1, new AnotherType { A = 456 } } }, I = new AnotherType { B = "def" } }; var b = new AnotherType() { A = 123 }; for (int i = 0; i < 100; i++) { ManualResetEvent allGo = new ManualResetEvent(false); var model = RuntimeTypeModel.Create(); model.AutoCompile = true; object starter = new object(); int waiting = 20; int failures = 0; Exception firstException = null; Thread[] threads = new Thread[20]; for (int j = 0; j < 10; j++) { threads[2 * j] = new Thread(() => { try { if (Interlocked.Decrement(ref waiting) == 0) { allGo.Set(); } allGo.WaitOne(); model.Serialize(Stream.Null, a); } catch (Exception ex) { Interlocked.CompareExchange(ref firstException, ex, null); Interlocked.Increment(ref failures); } }); threads[(2 * j) + 1] = new Thread(() => { try { if (Interlocked.Decrement(ref waiting) == 0) { allGo.Set(); } allGo.WaitOne(); model.Serialize(Stream.Null, b); } catch (Exception ex) { Interlocked.CompareExchange(ref firstException, ex, null); Interlocked.Increment(ref failures); } }); } for (int j = 0; j < threads.Length; j++) { threads[j].Start(); } for (int j = 0; j < threads.Length; j++) { threads[j].Join(); } Assert.Null(firstException); Assert.Equal(0, Interlocked.CompareExchange(ref failures, 0, 0)); } }