一、使用线程的理由

1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。

2、可以使用线程来简化编码。

3、可以使用线程来实现并发执行

二、基本知识

1、进程与线程:进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。

2、前台线程和后台线程:通过Thread类新建线程默认为前台线程。当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。

3、挂起(Suspend)和唤醒(Resume):由于线程的执行顺序和程序的执行情况不可预知,所以使用挂起和唤醒容易发生死锁的情况,在实际应用中应该尽量少用。

4、阻塞线程:Join,阻塞调用线程,直到该线程终止。

5、终止线程:Abort:抛出 ThreadAbortException 异常让线程终止,终止后的线程不可唤醒。Interrupt:抛出 ThreadInterruptException 异常让线程终止,通过捕获异常可以继续执行。

6、线程优先级:AboveNormal BelowNormal Highest Lowest Normal,默认为Normal。

三、线程的使用

线程函数通过委托传递,可以不带参数,也可以带参数(只能有一个参数),可以用一个类或结构体封装参数。

也可以如下写:

Thread SelectDataThread = SelectDataThread = new Thread(time_click);
 SelectDataThread.IsBackground = true;                        
 IsStartThreadOneTimes[providers_Code] = false;//为每个providercode设置一个锁,使这个线程只被执行一次
 SelectDataThread.Start();

void time_click(object target)
        {
            //System.Windows.Forms.MessageBox.Show("time_click(object target)");
            Thread.Sleep(10000);//延迟10s执行线程
            TimerForReadJsonDataByProviderCode();
            Thread.Sleep(15000);//延时15s再循环执行
            time_click(target);
        }

四、线程池

由于线程的创建和销毁需要耗费一定的开销,过多的使用线程会造成内存资源的浪费,出于对性能的考虑,于是引入了线程池的概念。线程池维护一个请求队列,线程池的代码从队列提取任务,然后委派给线程池的一个线程执行,线程执行完不会被立即销毁,这样既可以在后台执行任务,又可以减少线程创建和销毁所带来的开销。

线程池线程默认为后台线程(IsBackground)。

namespace Test {

class Program     {

static void Main(string[] args)         {             //将工作项加入到线程池队列中,这里可以传递一个线程参数

ThreadPool.QueueUserWorkItem(TestMethod, "Hello");

Console.ReadKey();         }

public static void TestMethod(object data)         {

string datastr = data as string;

Console.WriteLine(datastr);

}

}

}

五、Task类

使用ThreadPool的QueueUserWorkItem()方法发起一次异步的线程执行很简单,但是该方法最大的问题是没有一个内建的机制让你知道操作什么时候完成,有没有一个内建的机制在操作完成后获得一个返回值。为此,可以使用System.Threading.Tasks中的Task类。

构造一个Task<TResult>对象,并为泛型TResult参数传递一个操作的返回类型

最新文章

  1. devexpress 安装及破解
  2. swift tableview的分割线不能到头
  3. myeclipse打红叉
  4. sourcetree下回退
  5. [HDOJ2818]Building Block(带权并查集,路径压缩)
  6. 深度学习word2vec笔记之应用篇
  7. ioutil包二
  8. 转载 USB固件分析
  9. Swift Review总结:从 Swift Style 开始
  10. message.go
  11. Vue-router导航问题
  12. SpringBoot之Swagger2的使用
  13. HSSFClientAnchor 参数说明
  14. 3-hive、sqoop
  15. spring data jpa 查询自定义字段,转换为自定义实体
  16. 好用的 Chrome 插件,提升你的学习工作效率
  17. Java中String类型细节
  18. OC 点语法和变量作用域
  19. Pscp与服务器文件传递
  20. zoj 3983 Crusaders Quest 思维+枚举

热门文章

  1. C#导出GridView数据到Excel文件类
  2. Castle 集锦
  3. 浅析python的string.Template
  4. JQuery识别键盘操作 &amp; 键盘快捷键
  5. C 解决百度知道的一个高中题
  6. DWR在Spring中应用
  7. json转换对象
  8. MongoDB学习笔记-游标
  9. verilog中级别到底是什么?级别的分类是什么???
  10. 【工作总结】LLDB调试技巧 - 篇一