本文列举几种常用的c#多线程编程实例,其中主要参考了周公
http://blog.youkuaiyun.com/zhoufoxcn/article/details/4402999的文章,特此感谢。
-. WinForm多线程编程
1. new Thread()
新开一个线程,执行一个方法,并传递参数,ParameterizedThreadStart:
参数定义为object类型。
再一个例子:
http://blog.youkuaiyun.com/zhoufoxcn/article/details/4402999的文章,特此感谢。
-. WinForm多线程编程
1. new Thread()
新开一个线程,执行一个方法,没有参数传递,ThreadStart:
private void DoWork() {
Thread t = new Thread(new ThreadStart(this.DoSomething));//使用函数名称作为参数
t.Start();
}
private void DoSomething() {
Console.WriteLine("thread start");
}
新开一个线程,执行一个方法,并传递参数,ParameterizedThreadStart:
private void DoWork() {
Thread t = new Thread(new ParameterizedThreadStart(this.DoSomething));
t.Start("test");
}
private void DoSomething(object o) {
Console.WriteLine(o.ToString());
}
参数定义为object类型。
再一个例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace CShape
{
class Program
{
static void Main(string[] args)
{
Program g = new Program();
Thread parath = new Thread(new ParameterizedThreadStart(g.ParameterRun));
parath.Name = "Thread A";
parath.Start(500);//线程启动之后,线程的实例不必再存在.参数传递。
parath = new Thread(new ParameterizedThreadStart(g.ParameterRun));//故重新实例化
parath.Name = "Thread B";
parath.Start(1000);
}
public void ParameterRun(object ms)
{
int j = 10;
int.TryParse(ms.ToString(),out j);
for (int i = 0; i < 10; i++)
{
Console.WriteLine(Thread.CurrentThread.Name+"---当前时间为:" + DateTime.Now);
Thread.Sleep(j);//阻塞当前线程j毫秒
}
}
}
}
2. 多线程安全
当多个线程同时访问同一变量时,可能会导致变量的值出错,如典型的生产者和消费者进程。
常用的实现线程的同步有几种方法:lock、Mutex、Monitor、Semaphore、Interlocked和ReaderWriterLock等。
2.1 lock锁同步
lock语句是一种有效的、不跨越多个方法的小代码块同步的做法,也就是使用lock语句只能在某个方法的部分代码之间,不能跨越方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadSynchronization
{
class MyThread
{
private List<string> list;
private Thread th1;
private Thread th2;
private object objlock = new object();
public MyThread()
{
int N = 20;
list = new List<string>(N);
for (int i = 1; i <= N; i++)
list.Add(i.ToString().PadLeft(2, '0'));
th1 = new Thread(new ThreadStart(Run));
th1.Name = "Thread 1";
th2 = new Thread(new ThreadStart(Run));
th2.Name = "Thread 2";
th1.Start();
th2.Start();
}
//lock锁同步
private void Run()
{
while (list.Count > 0)
{
lock (objlock)//一个线程访问当前区域时,另一线程无法访问,直到访问完
{