首页 > 代码库 > C#学习笔记
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 }
二:线程
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 try23 {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 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 error102 }103 // Even though Main returns void, this provides a return code to the parent process.104 Environment.ExitCode = result;
1 public class SomeState 2 { 3 public int Cookie; 4 public SomeState(int iCookie) 5 { 6 Cookie = iCookie; 7 } 8 } 9 10 public class Alpha11 {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 thread25 Console.WriteLine(" {0} {1} :", Thread.CurrentThread.GetHashCode(), ((SomeState)state).Coo26 // The lock keyword allows thread-safe modification of variables accessible across multipl27 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 thread40 // loads should be wider.41 int iX = 2000;42 Thread.Sleep(iX);43 // The Interlocked.Increment method allows thread-safe modification44 // 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 try69 {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 }
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 MutexSample12 {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 t124 evs[1] = Event2; // Event for t225 evs[2] = Event3; // Event for t326 evs[3] = Event4; // Event for t427 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 signal41 42 Thread.Sleep(1000);43 Console.WriteLine(" - Main releases gM2");44 gM2.ReleaseMutex( ); // t1 and t4 will end and signal45 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 call56 gMs[1] = gM2;57 Mutex.WaitAll(gMs); // Waits until both gM1 and gM2 are released58 Thread.Sleep(2000);59 Console.WriteLine("t1Start finished, Mutex.WaitAll(Mutex[]) satisfied");60 Event1.Set( ); // AutoResetEvent.Set() flagging method is done61 }62 63 public void t2Start( )64 {65 Console.WriteLine("t2Start started, gM1.WaitOne( )");66 gM1.WaitOne( ); // Waits until Mutex gM1 is released67 Console.WriteLine("t2Start finished, gM1.WaitOne( ) satisfied");68 Event2.Set( ); // AutoResetEvent.Set() flagging method is done69 }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 call76 gMs[1] = gM2;77 Mutex.WaitAny(gMs); // Waits until either Mutex is released78 Console.WriteLine("t3Start finished, Mutex.WaitAny(Mutex[])");79 Event3.Set( ); // AutoResetEvent.Set() flagging method is done80 }81 82 public void t4Start( )83 {84 Console.WriteLine("t4Start started, gM2.WaitOne( )");85 gM2.WaitOne( ); // Waits until Mutex gM2 is released86 Console.WriteLine("t4Start finished, gM2.WaitOne( )");87 Event4.Set( ); // AutoResetEvent.Set() flagging method is done88 }89 }
C#学习笔记
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。