您的位置:首页 > 编程语言 > C#

C#学习笔记-线程

2016-04-11 14:07 645 查看
关键点

1,ThreadThreadPoolBackgroundWorker,task,Timer

2,AutoResetEvent 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程

通过调用 Set 发出资源可用的信号。

3,Mutex,SemaphoreLockMonitor

详解

1,进程(Process):进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。

进程启动

Process pro = Process.Start(@"C:\1.exe");


运行进程的查看

foreach (Process proi in Process.GetProcesses())
{
this.listView1.Items.Add(new ListViewItem(new string[]{proi.ProcessName,proi.Id.ToString(),proi.Threads.Count.ToString()}));
}


进程的关闭

Process pro = Process.Start(@"C:\1.exe");
...........................
pro.Kill();


2,线程(Thread):进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源

线程的创建,开启:

Thread th = new Thread(new ParameterizedThreadStart(Th));
th.Start();
........
public void Th(object sender)
{
while(true)
{
..............
}
}


线程的挂起:

th.Suspend();


线程的停止

th.Abort();


3,线程池(ThreadPool)

线程的添加

ThreadPool.QueueUserWorkItem(WaitBackF);
......................
public void WaitBackF(object sender)
{
while(true)
{
..................
}
}


4,Task

Task的开启:

//Task task1 = new Task(TaskF);
//task1.Start();
Task task1 = Task.Factory.StartNew(TaskF);
....................
public void TaskF()
{
while (true)
{
............................
}
}


5,BackgroundWorker

BackgroundWorker的创建和开启(另外可通过vs工具箱进行添加)

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(BWF);
bw.RunWorkerAsync();
........................
public void BWF(object sender, DoWorkEventArgs e)
{
while (true)
{
.........................
}

}


6,Timer定时器

this.timer1.Interval=100;

this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

this.timer1.Start();

7,Mutex互斥锁,同步时可使用

Thread threadTest0;
Thread threadTest1;
Mutex mutexTest0 = new Mutex(true,"MutexTest0");
//互斥锁的初始状态就是被主线程所占有
.....
//线程开启之前,需要释放Mutex,否则一直被主线程占有,其他线程无法获取状态
mutexTest0.ReleaseMutex();
//另外一种方法,Mutex mutexTest0 = new Mutex(false,"MutexTest0");//设置为false,互斥锁的初始状态就是自由
.....
private void ThreadFun0()
{
while (true)
{
Thread.Sleep(800);
mutexTest0.WaitOne();
MessageBox.Show("ThreadFun0");
mutexTest0.ReleaseMutex();
//break;
}
}
private void ThreadFun1()
{

while (true)
{
Thread.Sleep(800);
mutexTest0.WaitOne();
MessageBox.Show("ThreadFun1");
mutexTest0.ReleaseMutex();
//break;
}
}


8,Lock,线程同步时可使用

object obj=new object();
.....
Fun()
{
Lock(obj)
{
................
}
}


9,Monitor

Monitor.Enter(object)方法是获取锁

Monitor.Exit(object)方法是获取锁

注:Monitor为一个静态类,使用时,类似Mutex,不退出,该线程一直占有

Thread threadTest0;
Thread threadTest1;
object obj = new object();
private void ThreadFun0()
{
while (true)
{
Thread.Sleep(800);
Monitor.Enter(obj);
MessageBox.Show("ThreadFun0");
Monitor.Exit(obj);

}
}
private void ThreadFun1()
{

while (true)
{
Thread.Sleep(800);
Monitor.Enter(obj);
MessageBox.Show("ThreadFun1");
Monitor.Exit(obj);

}
}


10,ManualResetEvent,对一个或者多线程的同时的控制

ManualResetEvent manualEvent=new ManualResetEvent (false)

manualEvent.Reset(); //将事件状态设置为非终止状态,导致线程阻止。

manualEvent.Set(); //将事件状态设置为终止状态,允许一个或多个等待线程继续。

11,Semaphore

Semaphore semaphoreTest = new Semaphore(1, 3);//初始允许请求数为1,最大允许请求数为3

是操作系统维持的一个允许请求数。当允许请求数=0时,其他线程无法进入。当允许请求数>0时,线程可以进入。每当一个线程进入(semaphoreTest .waitOne()),允许请求数-1,线程退出后(semaphoreTest .Release())允许请求数+1。不能大于最大的允许请求数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# 线程