C#多线程和线程池
1.0、线程的和进程的关系以及优缺点
windows系统是一个多线程的操做系统。一个程序至少有一个进程,一个进程至少有一个线程。进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公共语言运行库)为该进程建立了一个线程,该线程称为主线程。例如当咱们建立一个C#控制台程序,程序的入口是Main()函数,Main()函数是始于一个主线程的。它的功能主要 是产生新的线程和执行程序。C#是一门支持多线程的编程语言,经过Thread类建立子线程。
引入命名空间 using System.Threading。编程
多线程的优势: windows
多线程的缺点:服务器
1.一、前台线程和后台线程
C#中的线程分为前台线程和后台线程,线程建立时不作设置默认是前台线程。即线程属性IsBackground=false。
Thread.IsBackground = false;
1.二、区别以及如何使用:
这二者的区别就是:应用程序必须运行完全部的前台线程才能够退出;而对于后台线程,应用程序则能够不考虑其是否已经运行完毕而直接退出,全部的后台线程在应用程序退出时都会自动结束。通常后台线程用于处理时间较短的任务,如在一个Web服务器中能够利用后台线程来处理客户端发过来的请求信息。而前台线程通常用于处理须要长时间等待的任务,如在Web服务器中的监听客户端请求的程序。
1.三、多线程的建立
首先使用new Thread()建立出新的线程,而后调用Start方法使得线程进入就绪状态,获得系统资源后就执行,在执行过程当中可能有等待、休眠、死亡和阻塞四种状态。正常执行结束时间片后返回到就绪状态。若是调用Suspend方法会进入等待状态,调用Sleep或者遇到进程同步使用的锁机制而休眠等待。具体过程以下图所示:多线程
System.Threading
System.Threading.Timer
System.Threading.Tasks编程语言
Thread th = new Thread(delegate ()
{
Response.Write("线程执行");
});
th.IsBackground = true;
th.Start();函数
或者操作系统
Thread th = new Thread(() =>
{
Response.Write("线程执行");
});pwa
th.IsBackground = true;
th.Start();线程
Task<string> task = Task.Factory.StartNew<string>(() =>
{
return "返回结果";
});
string result = task.Result;
或者对象
Task.Factory.StartNew(() =>
{
//用来计算运行时间
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
double ms = sw.ElapsedMilliseconds / 1000;
});
protected void Button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(WorkItem), null);
}
private void WorkItem(object obj)
{
TextBox1.Text = "执行完成";
}
子线程与主线程之间通讯
private SynchronizationContext synContext;
public MainWindow()
{
InitializeComponent();
//在这里记录主线程的上下文
synContext = SynchronizationContext.Current;
Task.Factory.StartNew(() =>
{
//用来计算运行时间
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
double ms = sw.ElapsedMilliseconds / 1000;
//通知主线程
synContext.Post(new SendOrPostCallback(OnConnected), null);
});
}
//因为是主线程的同步对象Post调用,这个是在主线程中执行的
private void OnConnected(object state)
{
//这里就回到了主线程里面了
//作一些事情
}
两个子线程的相互通讯
EventWaitHandle handleA = new AutoResetEvent(false);EventWaitHandle handleB = new AutoResetEvent(false);public 两个子线程的相互通讯(){ InitializeComponent(); ThreadPool.QueueUserWorkItem(ar => { //发出信号并等待另外一个 EventWaitHandle.SignalAndWait(handleB, handleA); }); ThreadPool.QueueUserWorkItem(ar => { handleB.WaitOne(); EventWaitHandle.SignalAndWait(handleA, handleB); handleA.Set(); });}