C#学习笔记

一:调用DLL

 1  //puts 函数的参数的默认封送处理从默认值 LPTSTR 重写为 LPSTR

 2  [DllImport("msvcrt.dll")]

 3  public static extern int puts([MarshalAs(UnmanagedType.LPStr)] string m);

 4  [DllImport("msvcrt.dll")]

 5  internal static extern int _flushall();

 6 

 7 

 8  // 如果没加 EntryPoint 的话 函数名必须和DLL中的函数名一致

 9  [DllImport("TestDLL.dll", EntryPoint = "fnTestDLL")]

10  public static extern int abc([MarshalAs(UnmanagedType.LPStr)]string m);

11 

12  static void Main(string[] args)

13  {

14      abc("asd");

15      puts("Hello World!");

16      _flushall();

17 

18      Console.Read();

19  }
调用DLL例子
 
  

二:线程

 1 public class Alpha

 2 {

 3     public void Beta()

 4     {

 5         while(true)

 6         {

 7             Console.WriteLine("Alpha.Beta is running in its own thread");

 8         }

 9     }

10 };

11 

12 

13 Alpha oAlpha = new Alpha();

14 Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));

15 oThread.Start();

16 while (!oThread.IsAlive) ;// 判断线程是否结束

17 Thread.Sleep(1);            // 放弃时间片

18 oThread.Abort();            // 关闭线程

19 

20 oThread.Join();              // 阻塞等待线程结束

21 

22 try

23 {

24     // 线程不允许重新启动

25     Console.WriteLine("Try to restart the Alpha.Beta thread");

26     oThread.Start();

27 }

28 catch(ThreadStateException)

29 {

30     Console.Write("ThreadStateException trying to restart Alpha.Beta. ");

31     Console.WriteLine("Expected since aborted threads cannot be restarted.");

32 }
线程例子1
  1 public class CellProd

  2 {

  3     Cell cell;         // Field to hold cell object to be used

  4     int quantity = 1;  // Field for how many items to produce in cell

  5 

  6     public CellProd(Cell box, int request)

  7     {

  8         cell = box;          // Pass in what cell object to be used

  9         quantity = request;  // Pass in how many items to produce in cell

 10     }

 11     public void ThreadRun()

 12     {

 13         for (int looper = 1; looper <= quantity; looper++)

 14             cell.WriteToCell(looper);  // "producing"

 15     }

 16 }

 17 

 18 public class CellCons

 19 {

 20     Cell cell;         // Field to hold cell object to be used

 21     int quantity = 1;  // Field for how many items to consume from cell

 22 

 23     public CellCons(Cell box, int request)

 24     {

 25         cell = box;          // Pass in what cell object to be used

 26         quantity = request;  // Pass in how many items to consume from cell

 27     }

 28     public void ThreadRun()

 29     {

 30         int valReturned;

 31         for (int looper = 1; looper <= quantity; looper++)

 32             valReturned = cell.ReadFromCell();

 33     }

 34 }

 35 

 36 public class Cell

 37 {

 38     int cellContents;         // Cell contents

 39     bool readerFlag = false;  // State flag

 40     public int ReadFromCell()

 41     {

 42         lock (this)   // Enter synchronization block

 43         {

 44             if (!readerFlag)

 45             {

 46                 // Waits for the Monitor.Pulse in WriteToCell

 47                 Monitor.Wait(this);

 48             }

 49             Console.WriteLine("Consume: {0}", cellContents);

 50             readerFlag = false;    // Reset the state flag to say consuming is done.

 51 

 52             Monitor.Pulse(this);   // Pulse tells Cell.WriteToCell

 53 

 54 }   // Exit synchronization block

 55         return cellContents;

 56     }

 57 

 58     public void WriteToCell(int n)

 59     {

 60         lock (this)  // Enter synchronization block

 61         {

 62             if (readerFlag)

 63             {

 64                 Monitor.Wait(this);   // Wait for the Monitor.Pulse in

 65             }

 66             cellContents = n;

 67             Console.WriteLine("Produce: {0}", cellContents);

 68             readerFlag = true;    // Reset the state flag to say producing is done

 69 

 70             Monitor.Pulse(this);  // Pulse tells Cell.ReadFromCell

 71 

 72         }   // Exit synchronization block

 73     }

 74 

 75 

 76 

 77 

 78 int result = 0;   // Result initialized to say there is no error

 79 Cell cell = new Cell( );

 80 

 81 CellProd prod = new CellProd(cell, 20);  // Use cell for storage, 

 82 CellCons cons = new CellCons(cell, 20);  // Use cell for storage, 

 83 

 84 Thread producer = new Thread(new ThreadStart(prod.ThreadRun));

 85 Thread consumer = new Thread(new ThreadStart(cons.ThreadRun));

 86 

 87 try

 88 {

 89    producer.Start( );

 90    consumer.Start( );

 91 

 92    producer.Join( );   // Join both threads with no timeout

 93    consumer.Join( );  

 94 }

 95 catch (ThreadStateException e)

 96 {

 97    result = 1;            // Result says there was an error

 98 }

 99 catch (ThreadInterruptedException e)

100 {

101    result = 1;            // Result says there was an error

102 }

103 // Even though Main returns void, this provides a return code to the parent process.

104 Environment.ExitCode = result;
C# lock 关键字和 Monitor 对象的 Pulse 方法完成同步
 1 public class SomeState

 2 {

 3     public int Cookie;

 4     public SomeState(int iCookie)

 5     {

 6         Cookie = iCookie;

 7     }

 8 }

 9 

10 public class Alpha

11 {

12     public Hashtable HashCount;

13     public ManualResetEvent eventX;

14     public static int iCount = 0;

15     public static int iMaxCount = 0;

16     public Alpha(int MaxCount)

17     {

18         HashCount = new Hashtable(MaxCount);

19         iMaxCount = MaxCount;

20     }

21 

22     public void Beta(Object state)

23     {

24         // Write out the hashcode and cookie for the current thread

25         Console.WriteLine(" {0} {1} :", Thread.CurrentThread.GetHashCode(), ((SomeState)state).Coo

26         // The lock keyword allows thread-safe modification of variables accessible across multipl

27         Console.WriteLine("HashCount.Count=={0}, Thread.CurrentThread.GetHashCode()=={1}",

28            HashCount.Count, Thread.CurrentThread.GetHashCode());

29         lock (HashCount)

30         {

31             if (!HashCount.ContainsKey(Thread.CurrentThread.GetHashCode()))

32                 HashCount.Add(Thread.CurrentThread.GetHashCode(), 0);

33             HashCount[Thread.CurrentThread.GetHashCode()] =

34                ((int)HashCount[Thread.CurrentThread.GetHashCode()]) + 1;

35         }

36 

37         // Do some busy work.

38         // Note: Depending on the speed of your machine, if you 

39         // increase this number, the dispersement of the thread

40         // loads should be wider.

41         int iX = 2000;

42         Thread.Sleep(iX);

43         // The Interlocked.Increment method allows thread-safe modification

44         // of variables accessible across multiple threads.

45         Interlocked.Increment(ref iCount);  //**********

46 

47 

48         if (iCount == iMaxCount)

49         {

50             Console.WriteLine();

51             Console.WriteLine("Setting eventX ");

52             eventX.Set();

53         }

54     }

55 }

56 

57 

58 

59 bool W2K = false;

60 int MaxCount = 10;

61 

62 ManualResetEvent eventX = new ManualResetEvent(false);    // Mark the event as unsignaled.

63 Alpha oAlpha = new Alpha(MaxCount);

64 

65 // Make sure the work items have a reference to the signaling event.

66 oAlpha.eventX = eventX;

67 Console.WriteLine("Queue to Thread Pool 0");

68 try

69 {

70   // 第二个参数是 作为 oAlpha.Beta 的参数

71   ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta), new SomeState(0));

72    W2K = true;

73 }

74 catch (NotSupportedException)

75 {

76    Console.WriteLine("These API's may fail when called on a non-Windows 2000 system.");

77    W2K = false;

78 }

79 if (W2K)  // If running on an OS which supports the ThreadPool methods.

80 {

81    for (int iItem=1;iItem < MaxCount;iItem++)

82    {

83       // Queue the work items:

84       Console.WriteLine("Queue to Thread Pool {0}", iItem);

85       ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta),new SomeState(iItem));

86    }

87    Console.WriteLine("Waiting for Thread Pool to drain");

88 

89    // Wait until event is fired, meaning eventX.Set() was called:

90    eventX.WaitOne(Timeout.Infinite,true);

91    // The WaitOne won't return until the event has been signaled.

92    Console.WriteLine("Thread Pool has been drained (Event fired)");

93    Console.WriteLine(); Console.WriteLine("Load across threads");

94    foreach(object o in oAlpha.HashCount.Keys)

95       Console.WriteLine("{0} {1}", o, oAlpha.HashCount[o]);

96 }
线程池 与 ManualResetEvent 对象的使用
 1 static Mutex gM1;

 2 static Mutex gM2;

 3 const int ITERS = 100;

 4 static AutoResetEvent Event1 = new AutoResetEvent(false);

 5 static AutoResetEvent Event2 = new AutoResetEvent(false);

 6 static AutoResetEvent Event3 = new AutoResetEvent(false);

 7 static AutoResetEvent Event4 = new AutoResetEvent(false);

 8 

 9 

10 

11 public class MutexSample

12 {

13     public static void Main(String[] args)

14     {

15         Console.WriteLine("Mutex Sample ...");

16         // Create Mutex initialOwned, with name of "MyMutex".

17         gM1 = new Mutex(true, "MyMutex");

18         // Create Mutex initialOwned, with no name.

19         gM2 = new Mutex(true);

20         Console.WriteLine(" - Main Owns gM1 and gM2");

21 

22         AutoResetEvent[] evs = new AutoResetEvent[4];

23         evs[0] = Event1;    // Event for t1

24         evs[1] = Event2;    // Event for t2

25         evs[2] = Event3;    // Event for t3

26         evs[3] = Event4;    // Event for t4

27 

28         MutexSample tm = new MutexSample( );

29         Thread t1 = new Thread(new ThreadStart(tm.t1Start));

30         Thread t2 = new Thread(new ThreadStart(tm.t2Start));

31         Thread t3 = new Thread(new ThreadStart(tm.t3Start));

32         Thread t4 = new Thread(new ThreadStart(tm.t4Start));

33         t1.Start( );   // Does Mutex.WaitAll(Mutex[] of gM1 and gM2)

34         t2.Start( );   // Does Mutex.WaitOne(Mutex gM1)

35         t3.Start( );   // Does Mutex.WaitAny(Mutex[] of gM1 and gM2)

36         t4.Start( );   // Does Mutex.WaitOne(Mutex gM2)

37 

38         Thread.Sleep(2000);

39         Console.WriteLine(" - Main releases gM1");

40         gM1.ReleaseMutex( );  // t2 and t3 will end and signal

41 

42         Thread.Sleep(1000);

43         Console.WriteLine(" - Main releases gM2");

44         gM2.ReleaseMutex( );  // t1 and t4 will end and signal

45 

46         // Waiting until all four threads signal that they are done.

47         WaitHandle.WaitAll(evs); 

48         Console.WriteLine("... Mutex Sample");

49     }

50 

51     public void t1Start( )

52     {

53         Console.WriteLine("t1Start started,  Mutex.WaitAll(Mutex[])");

54         Mutex[] gMs = new Mutex[2];

55         gMs[0] = gM1;  // Create and load an array of Mutex for WaitAll call

56         gMs[1] = gM2;

57         Mutex.WaitAll(gMs);  // Waits until both gM1 and gM2 are released

58         Thread.Sleep(2000);

59         Console.WriteLine("t1Start finished, Mutex.WaitAll(Mutex[]) satisfied");

60         Event1.Set( );      // AutoResetEvent.Set() flagging method is done

61     }

62 

63     public void t2Start( )

64     {

65         Console.WriteLine("t2Start started,  gM1.WaitOne( )");

66         gM1.WaitOne( );    // Waits until Mutex gM1 is released

67         Console.WriteLine("t2Start finished, gM1.WaitOne( ) satisfied");

68         Event2.Set( );     // AutoResetEvent.Set() flagging method is done

69     }

70 

71     public void t3Start( )

72     {

73         Console.WriteLine("t3Start started,  Mutex.WaitAny(Mutex[])");

74         Mutex[] gMs = new Mutex[2];

75         gMs[0] = gM1;  // Create and load an array of Mutex for WaitAny call

76         gMs[1] = gM2;

77         Mutex.WaitAny(gMs);  // Waits until either Mutex is released

78         Console.WriteLine("t3Start finished, Mutex.WaitAny(Mutex[])");

79         Event3.Set( );       // AutoResetEvent.Set() flagging method is done

80     }

81 

82     public void t4Start( )

83     {

84         Console.WriteLine("t4Start started,  gM2.WaitOne( )");

85         gM2.WaitOne( );   // Waits until Mutex gM2 is released

86         Console.WriteLine("t4Start finished, gM2.WaitOne( )");

87         Event4.Set( );    // AutoResetEvent.Set() flagging method is done

88     }

89 }
处理线程过程中使用 Mutex 类、AutoResetEvent 类和 WaitHandle 类

 

你可能感兴趣的:(学习笔记)