创建线程(Background Thread)的N种方式

来源:互联网 发布:招商银行看盘软件下载 编辑:程序博客网 时间:2024/04/29 12:22

原文地址:http://www.cnblogs.com/xchit/p/3425542.html

第一、Thread类

  Thread类是实例化线程的主要方法;一个Thread实例管理一个线程,即执行序列。通过简单实例化一个对象,就可以创建一个线程,然后通过Thread对象提供的方法对线程进行管理。

  

Thread thread = new Thread(_ => BackgroundMethod("第一、Thread类创建线程"));            thread.Start();            thread.Join();

 

第二、ThreadPool(线程池)类

  提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。

ThreadPool.QueueUserWorkItem(_ => BackgroundMethod("第二、ThreadPool创建线程"));

 

第三、delegate(委托)

  委托异步回调方法创建线程,只需调用BeginInvoke委托和触发线程。然后,调用EndInvoke将阻塞当前线程。

  

BackgroundMethodDelegate x = new BackgroundMethodDelegate(BackgroundMethod);            IAsyncResult a = x.BeginInvoke("第三、delegate委托", null, null);            x.EndInvoke(a);

 

第四、BackgroundWorker类

  在单独线程上执行操作

  

BackgroundWorker worker = new BackgroundWorker();            worker.DoWork += delegate { BackgroundMethod("第四、BackGroundWorker创建线程"); };            worker.RunWorkerAsync();

 

第五、System.Threading.Timer

  创建一个计时器,提供以指定时间间隔执行方法机制。

Timer timer = new System.Threading.Timer(_ => BackgroundMethod("第五、Timer计时器"), null, 0, Timeout.Infinite);

 

第六、Task类

  最简单的任务异步操作

  

using (Task task = new Task(() => BackgroundMethod("第六、Task类创建异步任务")))            {                task.Start();                task.Wait();            }

 

第七、Task.Factory(Task另外一种创建方式)

  创建实例工厂的访问

Task.Factory.StartNew(() => BackgroundMethod("第七、Task第二种创建异步方式"));

 

第八、Parallel类

   System.Threading.Tasks命名空间下的,提供对并行循环和区域支持

Parallel.Invoke(() => BackgroundMethod("第八、Parallel类"));

 

第九、System.Reactive.Linq.Observable

  Reactive Extensions 概要

  Reactive Extensions (下面简称 Rx) 是在 Linq 可操作的数据源上针对 "异步"(BeginXXX/EndXXX) 和 "事件"(XXXCompleted) 上的扩展,也可以被称为 "Linq To Asynchronous" 和 " Linq To Events"。相比以前复杂的异步处理或者事件处理,Timer的处理等,结合Linq 形式的Rx编程模型更加简洁。

  关于 Rx 的安装,可以通过 Reactive Extensions (Rx) 的主页 的直接下载安装,当然也可以利用 NuGet 导入 dll (http://nuget.org/packages/Rx-Main) [译注: NuGet 是VS集成的在线 dll部署工具,非常方便]。Rx 不管是 Installer 还是 NuGet 安装的,都有 Stable(稳定版) 和 Experimental(实验版) 两种。

  

Observable.Return("第九、Observable类", Scheduler.Default).Subscribe(BackgroundMethod);

 

第十、ProcessStartInfo类

  指定启动进程时使用的一组值,严格上应该不处于创建线程这一栏,但已被建议作为一种方式在后台做一些事情,即使它没有资格作为一个后台线程。 (根据定义,一个后台线程是进程中的一个线程不会防止进程终止,而它仍然在运行。 )

复制代码
ProcessStartInfo startInfo = new ProcessStartInfo("StartThreads.exe", "OutOfProcess");            startInfo.CreateNoWindow = false;            startInfo.UseShellExecute = false;            startInfo.RedirectStandardOutput = true;            Process process = Process.Start(startInfo);            Console.WriteLine(“第十:ProcessStartInfo”);            process.WaitForExit();
复制代码

 测试源码地址:http://files.cnblogs.com/xchit/StartThreads.rar