public bool Add(string[] names, MethodInfo methodInfo, object instance = default, object tag = default, int permissionLevel = default) { string id = MethodInfoToID(methodInfo); TextCommand command = new TextCommand(id, names, tag, permissionLevel, methodInfo, instance); bool cancel = false; OnAdding?.Invoke(command, ref cancel); if (cancel) { return(false); } ReaderWriterLockHelper.Write(commands => { CheckMethodOverload(commands, id); commands.Add(command); OnAdded?.Invoke(command); }); return(true); }
public void Add(DateTime dateTime) { if (dateTime <= DateTime.Now) { return; } ReaderWriterLockHelper.Write((ref List <DateTime> dateTimes) => { int i = 0; for (; i < dateTimes.Count; i++) { if (IgnoreSame && dateTime == dateTimes[i]) { Update(); return; } if (dateTime < dateTimes[i]) { break; } } dateTimes.Insert(i, dateTime); Update(); }); }
public void TestMethod1() { ReaderWriterLockHelper readerWriterLock = new ReaderWriterLockHelper(); AutoResetEvent autoResetEvent = new AutoResetEvent(false); int threadNumber = 3; int value = 10000; new Thread(() => { while (true) { bool needBreak = false; readerWriterLock.Read(() => { if (value <= 0) { needBreak = true; return; } Console.WriteLine($"线程 {Thread.CurrentThread.Name} 计数 {value}"); }); if (needBreak) { break; } } threadNumber--; if (threadNumber <= 0) { autoResetEvent.Set(); } }) { Name = "读" }.Start(); new Thread(() => { while (true) { bool needBreak = false; readerWriterLock.Write(() => { if (value <= 0) { needBreak = true; return; } value--; Console.WriteLine($"线程 {Thread.CurrentThread.Name} 计数 {value}"); }); if (needBreak) { break; } } threadNumber--; if (threadNumber <= 0) { autoResetEvent.Set(); } }) { Name = "写" }.Start(); new Thread(() => { while (true) { if (!readerWriterLock.TryEnterReadLock()) { continue; } try { if (!readerWriterLock.TryEnterWriteLock(out ReaderWriterLockCookie cookie)) { continue; } try { if (value <= 0) { break; } value--; Console.WriteLine($"线程 {Thread.CurrentThread.Name} 计数 {value}"); } finally { readerWriterLock.ExitWriteLock(ref cookie); } } finally { readerWriterLock.ExitReadLock(); } } threadNumber--; if (threadNumber <= 0) { autoResetEvent.Set(); } }) { Name = "读写" }.Start();