题目的意思是这样的:让两个线程A和B将自己的ID轮番写入一个文件中,每个线程重复十次写入后执行一个回调函数,说“I'm OK”,就这样。我是一名QA,不是开发,出于兴趣报考了公司的C#课程考试,多线程那些知识我也认真听过课,但是总归没有机会实际运用过,所以一到真正要动手写的时候也就基本等于不会了,最后我想了半天写了这样的一个程序,我感觉也算是符合了题的要求,还望各路大神不吝赐教,我好学习。也多帮我想想办法,应该怎么学习C#,包括反射,匿名方法和Lambda,委托,多线程,数据验证,等等这些知识的实际应用,给我出一些例题,谢谢啦!十分感谢。
以下是我的程序:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Threading; 7 using System.Diagnostics; 8 using System.IO; 9 10 namespace BLevelProgram 11 { 12 class BLevelProgram 13 { 14 public BLevelProgram() 15 { 16 //Constructor 17 } 18 19 //静态标识符——记录写入次数. 20 static int i = 0; 21 static int o = 0; 22 //权利标识符——判断线程是否具有写入权利,默认为true,true为线程1的写入权利,false为线程2的写入权利. 23 static bool flag = true; 24 25 public static void Main() 26 { 27 //创建文件夹路径. 28 Directory.CreateDirectory(@"C:\tylan"); 29 Thread.Sleep(5000); 30 //创建输出文件并关闭. 31 File.Create(@"C:\tylan\File.txt").Close(); 32 //后台线程a,b轮流向文件交替写入数据. 33 Thread a = new Thread(kick1); 34 a.IsBackground = true; 35 Thread b = new Thread(kick2); 36 b.IsBackground = true; 37 a.Start(); 38 b.Start(); 39 //让主线程等待后台线程. 40 Thread.Sleep(1000000); 41 Console.ReadLine(); 42 } 43 44 //向文件中写入当前thread的ID. 45 public static void kick1() 46 { 47 for (int c = 1; c <= 12; c++) 48 { 49 //判断线程是否具有写入权利. 50 while (flag == false) 51 { 52 //没有权利的时候就继续等待. 53 Thread.Sleep(1000); 54 } 55 //小于10次写入则继续写入. 56 if (i < 10) 57 { 58 //输出采取追加模式. 59 StreamWriter file = new StreamWriter(@"C:\tylan\File.txt", true); 60 //写一行到文件中. 61 file.WriteLine(Thread.CurrentThread.ManagedThreadId); 62 //控制台显示结果. 63 Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 64 //关闭文件. 65 file.Close(); 66 //线程a写入次数加一. 67 i++; 68 //把写入权利交给线程b. 69 flag = false; 70 } 71 //等于10次就回调. 72 else 73 { 74 //执行线程回调函数. 75 ThreadCallBack(); 76 } 77 } 78 } 79 80 //向文件中写入当前thread的ID. 81 public static void kick2() 82 { 83 for (int c = 1; c <= 12; c++) 84 { 85 //判断线程是否具有写入权利 86 while (flag == true) 87 { 88 //没有权利的时候就继续等待. 89 Thread.Sleep(1000); 90 } 91 //小于10次写入则继续写入. 92 if (o < 10) 93 { 94 //输出采取追加模式. 95 StreamWriter file = new StreamWriter(@"C:\tylan\File.txt", true); 96 //写一行到文件中. 97 file.WriteLine(Thread.CurrentThread.ManagedThreadId); 98 //控制台显示结果. 99 Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 100 //关闭文件. 101 file.Close(); 102 //线程b的写入次数加一. 103 o++; 104 //把写入权利交给线程a. 105 flag = true; 106 } 107 //等于10次就回调. 108 else 109 { 110 //执行线程回调函数. 111 ThreadCallBack(); 112 } 113 } 114 } 115 116 //线程回调函数 117 public static void ThreadCallBack() 118 { 119 //在函数中输出"I'm OK.". 120 Console.WriteLine("I'm OK."); 121 } 122 } 123 }
执行后的结果在控制台输出是:
文件中的输出结果为: