示例#1
0
        /// <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));
        }
示例#2
0
 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());
     }
 }
示例#3
0
 /// <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();
        }
示例#5
0
 public BoundChannelTest()
 {
     _boundChannel = new BoundChannel <int>(5);
 }
示例#6
0
 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");
     }
 }
示例#7
0
 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);
        }