1.  Thread类

C#多线程编程中Thread类需要包含名称空间System.Threading。

class Program
{
static void Main(string[] args)
{
Thread thread01 = new Thread(ThreadTask01);
thread01.Start();
// thread01.Join(); for (int i = 0; i < 5; i++)
{
Console.WriteLine("Thread Main is working !");
Thread.Sleep(20);
} Console.ReadKey(); }
static void ThreadTask01()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Thread task one is working !");
Thread.Sleep(20);
}
}
}

输出:

Start不会阻塞主线程,如果加入Join,则会阻塞主线程的执行,直到子线程执行完成才把控制权交还给主流程,但是各个子线程之间的并行执行不受Join影响。上例中加入Join的输出:

多个线程同时访问一个公共字段时,容易引起线程安全问题,C#中使用关键字lock保证数据的安全性和同步:

class Program
{
//static readonly object locker = new object();
static int TotalNum = 100; static void Main(string[] args)
{
Thread thread01 = new Thread(ThreadTask01);
Thread thread02 = new Thread(ThreadTask02);
thread01.Start();
thread02.Start(); Console.ReadKey(); }
static void ThreadTask01()
{
while (TotalNum > 0)
{
Console.WriteLine(TotalNum);
TotalNum--;
Thread.Sleep(10);
}
} static void ThreadTask02()
{
while (TotalNum > 0)
{
Console.WriteLine(TotalNum);
TotalNum--;
Thread.Sleep(10);
}
}
}

输出异常,中间有重复输出的数字:

添加lock:

class Program
{
static readonly object locker = new object();
static int TotalNum = 100; static void Main(string[] args)
{
Thread thread01 = new Thread(ThreadTask01);
Thread thread02 = new Thread(ThreadTask02);
thread01.Start();
thread02.Start(); Console.ReadKey(); }
static void ThreadTask01()
{
while (TotalNum > 0)
{
lock (locker)
{
Console.WriteLine(TotalNum);
TotalNum--;
}
Thread.Sleep(10);
}
} static void ThreadTask02()
{
while (TotalNum > 0)
{
lock (locker)
{
Console.WriteLine(TotalNum);
TotalNum--;
}
Thread.Sleep(10);
}
}
}

输出正常:

2. ParameterThreadStart委托

ParameterThreadStart委托定义为 void ParameterizedThreadStart(Object state)。

class Program
{
static int totalNum = 10;
static void Main(string[] args)
{
ParameterizedThreadStart thread01 = new ParameterizedThreadStart(ThreadTask01);
Thread thread = new Thread(thread01);
thread.Start(totalNum);
Console.ReadKey(); }
static void ThreadTask01(object obj)
{
for (int i = 0; i < Convert.ToInt32(obj); i++)
{
Console.WriteLine(i);
Thread.Sleep(10);
}
}
}

3. 匿名方法

匿名方法启动多线程是使用Thread类的另一种更加灵活的方法。

class Program
{
static void Main(string[] args)
{
ThreadStart threadStart = new ThreadStart(delegate ()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Thread one is working!");
}
});
Thread thread = new Thread(threadStart);
thread.Start();//多线程启动匿名方法
//等待线程结束
while (thread.ThreadState != ThreadState.Stopped)
{
Thread.Sleep(10);
}
Console.ReadKey();
} }

4. Delegate委托

委托是一种比较高级的多线程方法,可以传入参数和获取返回值,还可以查询异步操作是否完成。

class Program
{
private delegate int NewTaskDelegate(int ms);
private static int newTask(int ms)
{
Console.WriteLine("任务开始");
Thread.Sleep(ms);
Random random = new Random();
int n = random.Next(10000);
Console.WriteLine("任务完成");
return n;
}
static void Main(string[] args)
{
NewTaskDelegate task = newTask;
IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);
//EndInvoke方法将被阻塞2秒 //使用WaitOne阻塞主线程,直到子线程完成操作
while (!asyncResult.AsyncWaitHandle.WaitOne(100, false))
{
Console.Write("-");
} while (!asyncResult.IsCompleted) //查询线程是否完成
{
Console.Write("*");
Thread.Sleep(100);
}
int result = task.EndInvoke(asyncResult);
Console.WriteLine(result);
Console.Read();
}
}

最新文章

  1. 控制反转(IOC)
  2. The Engine Document of JustWeEngine
  3. [Android]电话拨号器开发
  4. Javascript模式(第四章函数)------读书笔记
  5. sublime text 之添加插件 并使用
  6. 使用Loadrunner进行http接口压力测试
  7. 如何计算一个字符串表示的计算式的值?——C_递归算法实现
  8. Android 自定义View修炼-Android中常见的热门标签的流式布局的实现
  9. uploadify上传图片(限制最多五张)
  10. C# StreamReader/StreamWriter与FileStream用法详解
  11. Android图表日历控件组件
  12. Qt-剪切板
  13. 修改weblogic中StuckThreadMaxTime参数
  14. HDU1171--Big Event in HDU(多重背包)
  15. 使用adb shell启动特定activity
  16. JAVA8之lambda表达式具体解释,及stream中的lambda使用
  17. win10 桌面设置为远程桌面
  18. C#中#region和#endregion的用法
  19. Macro-Micro Adversarial Network for Human Parsing
  20. li内有span需要右浮的问题

热门文章

  1. 【ALearning】第四章 Android Layout组件布局(二)
  2. Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件
  3. bootstrap+fileinput插件实现可预览上传照片功能
  4. [TypeStyle] Use TypeStyle keyframes to create CSS animations
  5. css3-11 如何实现2D动画
  6. ZOJ 2514 Generate Passwords 水
  7. php实现求最小的k个数(日常出错很容易是分号或者$符号忘记写了)
  8. oracle 列授权相关测试
  9. http各种状态码具体解释
  10. iOS --- UIColor中使用16进制选取颜色