一直没有系统学习过C# 的多线程,今天跑一个图片迁移的小程序时,发现速度奇慢,想着要是改成多线程的应该就会好很多,但是改造过程总是出现奇奇怪怪的错误,怪只怪基础没打好,下决心要从基础开始了解多线程。
1.多线程实现方式
private void btnThreadTest_Click(object sender, EventArgs e)
{
try
{
// CreatThreadByNewThread();
// CreatThreadByThreadPool();
CreatThreadByTask();
CreatThreadByDelegate();
for (var i = 0; i < 10000; i++)
{
Console.Write(i + "x");
}
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 直接new一个Thread
/// </summary>
public void CreatThreadByNewThread() {
try
{
//1.直接new一个新线程
//Thread firstThread = new Thread(new ThreadStart(ThreadTest1));//无参线程
Thread firstThread = new Thread(new ParameterizedThreadStart(ThreadTest1));
firstThread.Start("线程参数");
firstThread.Join();//同下文中task的wait
Thread.Sleep(1);//暂停当前线程一段时间,单位微秒 ,Thread.Sleep(0)立即放弃这个线程的时间片,主动交出CPU给其他线程
}
catch (Exception)
{
throw;
}
}
//使用线程池
public void CreatThreadByThreadPool() {
try
{
//2.线程池
ThreadPool.UnsafeQueueUserWorkItem(ThreadTest1, "线程参数");
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 使用task
/// </summary>
public void CreatThreadByTask()
{
try
{
//3.task执行
Task<int> t1 = new Task<int>(n => ThreadTest2((object)n), "线程参数");
t1.Start();
t1.Wait();//等待线程执行完成
Task tend = t1.ContinueWith(task => Console.WriteLine("Thread result is {0}", t1.Result));
}
catch (Exception)
{
throw;
}
}
//使用委托异步执行
public void CreatThreadByDelegate() {
try
{
//4. 委托异步执行
MyDelegate mydelegate = new MyDelegate(ThreadTest2);
IAsyncResult result = mydelegate.BeginInvoke("线程执行参数", ThreadCallback, "线程回调参数");//线程执行完成后自动执行的回调函数
int resstr = mydelegate.EndInvoke(result);//会等待线程执行完成后执行
Console.WriteLine("Thread result is {0}", resstr);
}
catch (Exception)
{
throw;
}
}
2.多线程数据安全。
对于多线程共享的数据,且有线程对共享数据存在写操作时,需要添加独占锁,lock,将线程对改共享数据操作部分加锁,下面中done就是共享数据
static readonly object locker = new object(); lock (locker) { if (!done) { Console.WriteLine("Done"); done = true; } }
当某一个线程访问独占锁时,其他线程会阻塞等待,独占锁的释放,
参考文章:http://www.cnblogs.com/jackson0714/p/5100372.html
http://www.cnblogs.com/luxiaoxun/p/3280146.html
原文:http://www.cnblogs.com/huanglin101/p/6430102.html