⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c9-08.cs

📁 一本很好的教材.C#开发者必备.内容全面,很难得哦.
💻 CS
字号:
// 运用Interlocked类同步线程示例
using System;
using System.Threading;
class SyncResource {
   public void Access(Int32 threadNum) {
      // 使用Monitor类强迫同步
      lock (this) {
       // 不管下个条件,每个线程等待前一个线程
       if (threadNum % 2 == 0)
         Thread.Sleep(2000);
         Console.WriteLine("开始同步资源访问(Thread={0})", threadNum);
         Thread.Sleep(200);
         Console.WriteLine("停止同步资源访问(Thread={0})", threadNum);
      }
   }
}
// 无论是否锁定,该方法总是按照到达的线程的顺序被调用
class UnSyncResource {
   public void Access(Int32 threadNum) {
    // 不使用Monitor强迫同步
    // 根据线程顺序号调用
    if (threadNum % 2 == 0)
      Thread.Sleep(2000);
     Console.WriteLine("开始异步资源访问(Thread={0})", threadNum);
     Thread.Sleep(200);
     Console.WriteLine("停止异步资源访问(Thread={0})", threadNum);
   }
}
public class App {
   static Int32 numAsyncOps = 3;
   static AutoResetEvent asyncOpsAreDone = new AutoResetEvent(false);
   static SyncResource SyncRes = new SyncResource();
   static UnSyncResource UnSyncRes = new UnSyncResource();
   public static void Main() {
      for (Int32 threadNum = 0; threadNum < 3; threadNum++) {
         ThreadPool.QueueUserWorkItem(new WaitCallback(SyncUpdateResource), threadNum);
      }
      // 等待WaitHandle
     asyncOpsAreDone.WaitOne();
      Console.WriteLine("\t\n所有同步操作已经完成\t\n");
     // 重设将被异步调用的线程数量
     numAsyncOps = 3;
      for (Int32 threadNum = 0; threadNum < 3; threadNum++) {
         ThreadPool.QueueUserWorkItem(new WaitCallback(UnSyncUpdateResource), threadNum);
      }
      // 等待WaitHandle
     asyncOpsAreDone.WaitOne();
      Console.WriteLine("\t\n所有异步操作已经完成");
   }
   static void SyncUpdateResource(Object state) {
     // 通过传递一个线程号调用内部同步
      SyncRes.Access((Int32) state);
     // 对调用线程进行计数
      if (Interlocked.Decrement(ref numAsyncOps) == 0)
         // 所有线程调用已经完成
         asyncOpsAreDone.Set(); 
   }
   static void UnSyncUpdateResource(Object state) {
     // 通过传递一个线程号调用内部同步
      UnSyncRes.Access((Int32) state);
     // 对调用线程进行计数
      if (Interlocked.Decrement(ref numAsyncOps) == 0)
         // 所有线程调用已经完成
         asyncOpsAreDone.Set(); 
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -