public static async Task Take_AtThread_2(Adapter_ProducerConsumer <TItem> buffer, HashSet <TItem> addSerial) { Assert.IsTrue(buffer.Count == 0); TItem first = addSerial.ElementAt(0); TItem second = addSerial.ElementAt(1); AddState <TItem> addState_First = new AddState <TItem>(buffer, first); AddState <TItem> addState_Second = new AddState <TItem>(buffer, second); Timer timerReaction_First = new Timer(TimeOut_AddAction, addState_First, DelayWait, Timeout.Infinite); Timer timerReaction_Second = new Timer(TimeOut_AddAction, addState_Second, DelayWaitDouble, Timeout.Infinite); ResultDouble <TItem> result = await buffer.Take_AtThread_2(); Assert.IsTrue(buffer.Count == 0); if (result.Value_1.Equals(first)) { Assert.IsTrue(result.Value_2.Equals(second)); } else { Assert.IsTrue(result.Value_1.Equals(second)); Assert.IsTrue(result.Value_2.Equals(first)); } }
public async Task Add_AtThread_2(T item_1, T item_2) { ResultDouble <T> result = new ResultDouble <T>(); _countThread++; _tableThread.AddOrUpdate(_countThread, true, (i, b) => { return(true); }); Thread threadFirst = new Thread(new ParameterizedThreadStart(AddAction)); threadFirst.IsBackground = true; ItemChangeState <T> parameterFirst = new ItemChangeState <T>() { KeyThread = _countThread, Item = item_1 }; _countThread++; _tableThread.AddOrUpdate(_countThread, true, (i, b) => { return(true); }); Thread threadSecond = new Thread(new ParameterizedThreadStart(AddAction)); threadSecond.IsBackground = true; ItemChangeState <T> parameterSecond = new ItemChangeState <T>() { KeyThread = _countThread, Item = item_2 }; threadFirst.Start(parameterFirst); threadSecond.Start(parameterSecond); result.Value_1 = await Task <T> .Run( () => { while (_tableThread[parameterFirst.KeyThread]) { } return(parameterFirst.Item); } ); result.Value_2 = await Task.Run( () => { while (_tableThread[parameterSecond.KeyThread]) { } return(parameterSecond.Item); } ); }