/// <summary> /// 关闭 /// </summary> public async void Close() { await BoundChannel.CloseAsync(); await BossGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)); await WorkerGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)); }
public static void grabData(BoundChannel<String> boundDataChannel) { while (true) { Thread.Sleep(DELAY_SECONDS * 1000); Console.WriteLine(Thread.CurrentThread.Name + " about to take data from channel"); Console.WriteLine("Got: " + boundDataChannel.Take()); } }
/// <summary> /// The StopAsync /// </summary> /// <param name="cancellationToken">The <see cref="CancellationToken"/></param> /// <returns>The <see cref="Task"/></returns> public async Task StopAsync() { // Stop called without start if (BoundChannel == null) { return; } try { // Signal cancellation to the executing method await BoundChannel.CloseAsync(); } catch (Exception) { } }
public void TestStart() { boundChannel = new BoundChannel<int>(2); Thread put1 = new Thread(() => PutBoundChannel(5, 0)); put1.Name = "Put Thread 1"; Thread put2 = new Thread(() => PutBoundChannel(5, 0)); put2.Name = "Put Thread 2"; Thread put3 = new Thread(() => PutBoundChannel(1, 0)); put3.Name = "Put Thread 3"; Thread put4 = new Thread(() => PutBoundChannel(1, 0)); put4.Name = "Put Thread 4"; Thread put5 = new Thread(() => PutBoundChannel(1, 0)); put5.Name = "Put Thread 5"; Thread take1 = new Thread(() => TakeBoundChannel(13, 2000)); take1.Name = "Take Thread 1"; put1.Start(); put2.Start(); put3.Start(); put4.Start(); put5.Start(); take1.Start(); }
public BoundChannelTest() { _boundChannel = new BoundChannel <int>(5); }
static void Main(string[] args) { Console.WriteLine("Enter the utility class you would like to test:\n" + "OPTIONS:\n" + "\tsemaphore\n" + "\tchannel\n" + "\tboundedchannel\n" + "\tlightswitch\n" + "\tlatch\n" + "\trwlock\n" + "\tmutex\n" + "\tFIFOSemaphore\n" + "\tExchanger"); Console.Write("> "); String command = Console.ReadLine(); command = command.ToLower(); if (command.Length > 0) { switch (command) { case "semaphore": ConcurrencyUtils.Semaphore testSemaphore = new ConcurrencyUtils.Semaphore(0); List<Thread> threads = new List<Thread>(); for (int i = 0; i < TEST_THREADS; i++) { Thread newThread = new Thread(() => SemaphoreTest(testSemaphore)); newThread.Name = i.ToString(); // Console.WriteLine(newThread.Name + " created"); newThread.Start(); threads.Add(newThread); } Thread releaserThread = new Thread(() => SemaphoreTestReleaser(testSemaphore)); releaserThread.Name = "R"; releaserThread.Start(); break; case "mutex": ConcurrencyUtils.Mutex testMutex = new ConcurrencyUtils.Mutex(); List<Thread> mutexThreads = new List<Thread>(); for (int i = 0; i < TEST_THREADS; i++) { Thread newThread = new Thread(() => SemaphoreTest(testMutex)); newThread.Name = i.ToString(); newThread.Start(); mutexThreads.Add(newThread); } Thread mutexReleaserThread = new Thread(() => MutexTestReleaser(testMutex)); mutexReleaserThread.Name = "R"; mutexReleaserThread.Start(); break; case "channel": Channel<String> testChannel = new Channel<String>(); List<Thread> grabberThreads = new List<Thread>(); Thread putterThread = new Thread(() => putData(testChannel)); putterThread.Name = "Putter"; putterThread.Start(); for (int i = 0; i < TEST_THREADS; i++) { Thread newThread = new Thread(() => grabData(testChannel)); newThread.Name = "Thread" + i; Console.WriteLine(newThread.Name + " created"); newThread.Start(); grabberThreads.Add(newThread); } break; case "boundedchannel": BoundChannel<String> testBoundChannel = new BoundChannel<String>(CHANNEL_SIZE); List<Thread> putterThreads = new List<Thread>(); Thread grabberThread = new Thread(() => grabData(testBoundChannel)); grabberThread.Name = "Grabber"; grabberThread.Start(); for (int i = 0; i < TEST_THREADS; i++) { Thread newThread = new Thread(() => putData(testBoundChannel)); newThread.Name = "Thread" + i; Console.WriteLine(newThread.Name + " created"); newThread.Start(); putterThreads.Add(newThread); } break; case "lightswitch": ConcurrencyUtils.Semaphore semaphore = new ConcurrencyUtils.Semaphore(1); LightSwitch writeSwitch = new LightSwitch(semaphore); List<Thread> writerThreads = new List<Thread>(); Thread lonelyThread = new Thread(() => lonelyThreadWrite( semaphore ) ); lonelyThread.Start(); for (int i = 0; i < 10; i++) { Thread newThread = new Thread(() => groupThreadWrite(writeSwitch)); newThread.Name = "Thread" + i; newThread.Start(); writerThreads.Add(newThread); } break; case "latch": Latch latch = new Latch(); List<Thread> waiters = new List<Thread>(); for (int i = 0; i < 100; i++) { Thread newThread = new Thread(() => latchAcquire(latch)); newThread.Name = "Thread" + i; newThread.Start(); } Thread unlocker = new Thread(() => latchRelease(latch)); unlocker.Start(); break; case "rwlock": ConcurrencyUtils.ReaderWriterLock RWLock = new ConcurrencyUtils.ReaderWriterLock(); for (int i = 0; i < 10; i++) { Thread newThread = new Thread(() => readLots(RWLock)); newThread.Name = "Reader Thread" + i; newThread.Start(); } for (int i = 0; i < 2; i++) { Thread newThread = new Thread(() => writeLots(RWLock)); newThread.Name = "Writer Thread" + i; newThread.Start(); } break; case "fifosemaphore": FIFOSemaphore fifoSemaphore = new FIFOSemaphore(1); for (int i = 0; i < 4; i++) { Thread t = new Thread(() => acquireWaitRelease(fifoSemaphore)); t.Name = "Thread" + i; t.Start(); Thread.Sleep(1000); } break; case "exchanger": Exchanger<String> exchanger = new Exchanger<String>(); String string1 = "String 1"; String string2 = "String 2"; Thread thread1 = new Thread(() => exchangeString(exchanger, string1)); Thread thread2 = new Thread(() => exchangeString(exchanger, string2)); thread1.Name = "Thread 1"; thread2.Name = "Thread 2"; thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); break; default: Console.WriteLine("Test for '" + args[0] + "' not implemented"); break; } } else { Console.WriteLine("No argument provided"); } }
public static void putData(BoundChannel<String> boundDataChannel) { while (true) { Console.WriteLine(Thread.CurrentThread.Name + " about to put data on the channel"); boundDataChannel.Put(DATA_STRING); } }
public void TestStart() { Console.WriteLine ("\nPoll Test!\n"); ChannelTest = new Channel<int>(); String tabs = ""; for (int i = 0; i < 6; i++) { Thread aquireTask = new Thread(TakeItem); aquireTask.Name = tabs + "Thread " +i; aquireTask.Start(); Thread.Sleep(50); tabs += "\t"; } Thread ReleaseItemsThread = new Thread(ReleaseItems); ReleaseItemsThread.Start(); Thread.Sleep (6000); Console.WriteLine ("\nOffer Test!\n"); BoundChannelTest = new BoundChannel<int>(2); tabs = ""; for (int i = 0; i < 8; i++) { Thread aquireTask = new Thread(GiveItem); aquireTask.Name = tabs + "Thread " +i; aquireTask.Start(); Thread.Sleep(50); tabs += "\t"; } Thread GiveItemThread = new Thread(TakeItems); GiveItemThread.Start(); Thread.Sleep (6000); }