线程研究:(一)单线程编程 .net 2

序:一直都在用线程,但没有对它有系统的研究,这个东西用得比较频繁,这几天打算总结一下。大体涉及内容:

  1. .NET 2 中的线程研究;

  2.  SmartThreadPool 线程工具研究;

  3.  .NET 4 中计划任务研究;

程序员,要不断的补充啊,对,我很饿了。来吧,跟我一起补充点营养吧,营养过剩的可走开。

 

.NET 2 中的线程研究

.NET Framework 2.0线程简介

  .NET Framework 2.0线程处理的命名空间为:System.Threading 。该命名空间提供:

  同步线程活动和访问数据的类(MutexMonitorInterlockedAutoResetEvent 等)

  线程池(ThreadPool )和一个Timer 类(它在线程池线程上执行回调方法);

 

 涉及到的重要类

Thread

创建并控制线程,设置其优先级并获取其状态。

ThreadPool提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。
Timer提供以指定的时间间隔执行方法的机制。无法继承此类。

同步

Interlocked为多个线程共享的变量提供原子操作。
EventWaitHandle表示一个线程同步事件。
Monitor提供同步对对象的访问的机制。

共享

Interlocked为多个线程共享的变量提供原子操作。
Semaphore限制可同时访问某一资源或资源池的线程数。
WaitHandle封装等待对共享资源的独占访问的操作系统特定的对象。

ReaderWriterLock定义支持单个写线程和多个读线程的锁。

   

涉及结构
AsyncFlowControl提供功能以还原执行上下文在线程之间的迁移(或流动)。
AsyncFlowControl提供功能以还原执行上下文在线程之间的迁移(或流动)。
NativeOverlapped提供一种显式布局,它在非托管代码中可见,并将具有与 Win32 OVERLAPPED 结构相同的布局且在结尾有附加保留的字段。
涉及枚举   
ThreadState指定 Thread 的执行状态。(常用)
ThreadPriority指定 Thread 的调度优先级。
EventResetMode指示在接收信号后是自动重置 EventWaitHandle 还是手动重置。
ApartmentState指定 Thread 的单元状态。
涉及委托

   

ThreadStart表示在 Thread 上执行的方法。
ParameterizedThreadStart表示在 Thread 上执行的方法。
WaitCallback表示线程池线程要执行的回调方法。
TimerCallback表示处理来自 Timer 的调用的方法。

   这里大致罗列平时需要的类、委托、枚举和结构,详情可参照:http://msdn.microsoft.com/zh-cn/library/798axes2(v=VS.80).aspx

实用场景

   假设有这么一种情形,一个任务由10个子任务执行,每个子任务执行时间为10秒。我们用这个事情来模拟单线程、多线程、线程池的使用情况,也会涉及到线程同步,异步线程。

   先写一个任务类,假设10个子任务都是一样的(要把相同的事做10次才算完);

  

using System;
using System.Collections.Generic;
using System.Text;

namespace Thread.V2
{
    /// <summary>
    /// 任务项信息
    /// </summary>
    public class TaskItemInfo
    {
        /// <summary>
        /// 任务是否完成
        /// </summary>
        public bool IsComplete{ get; set; }

        /// <summary>
        /// 任务状态说明
        /// </summary>
        public string StateDescription{ get; set; }
    }
}

   单线程编程

/*-------------------------------------------------------------------------
* 版权所有:吻天开发团队
* 作者:邓福勇
* 联系:dfyong@hotmail.com
* 操作:创建
* 时间:9/6/2011 10:40:18 AM 
* CLR版本:4.0.30319.235
* 唯一标识:f0458010-5e52-4973-a351-4f9967bd75a9
* 版本号:v1.0
* 功能说明:
*  -------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace Thread.V2
{
    public class SingleThread
    {
        public  void ExecuteTask()
        {
            List<TaskItemInfo> taskList = GetTaksItems();

            foreach (TaskItemInfo taskItem in taskList)
            {
                DoTask(taskItem);

            }
        }

        /// <summary>
        /// 执行任务
        /// </summary>
        /// <param name="taskItemInfo">任务项</param>
        /// <returns>任务项信息</returns>
        private void DoTask(TaskItemInfo taskItemInfo)
        {
            if (taskItemInfo == null)
            {
                return;
            }

            taskItemInfo.IsComplete = false;
            taskItemInfo.StateDescription = "--------------开始执行---------------";

            Console.WriteLine(taskItemInfo.StateDescription);

            System.Threading.Thread.Sleep(2000);// 模拟处理10秒

            taskItemInfo.IsComplete = true;
            taskItemInfo.StateDescription = "完成";

            Console.WriteLine(taskItemInfo.StateDescription);
        }

        private  List<TaskItemInfo> GetTaksItems()
        {
            List<TaskItemInfo> list = new List<TaskItemInfo>();

            for (int i = 0; i < 10; i++)
            {
                list.Add(new TaskItemInfo() { IsComplete = false, StateDescription = "未执行" });
            }

            return list;
        }
    }
}

测试代码:

 #region  Thread.V2--SingleThread

            SingleThread singleThread = new SingleThread();

            // 创建线程
            System.Threading.Thread thread = new System.Threading.Thread(singleThread.ExecuteTask);

            // 打开线程
            thread.Start();

            // 让主线程等待子线程完成
            thread.Join(); 

            #endregion

结果:


说点无关

上面的例子,一个简单的线程同步编程。与之对应的是异步编程。二者简单可以这样区分:

同步:提交请求->等待服务器处理-〉处理(这个期间不能干其他任何事)-〉处理完毕
异步: 提交请求->等待服务器处理-〉处理(这个期间干其他事)->处理完毕

关于异步编程,不是本文重点。我在以前写过一篇比较粗糙的文章《异步编程 .net》,查看尚可。

接下来

   线程研究(二):多线程编程 .net 2

   多线程同步

   线程池

 

 

 

 

  

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值