C#中关于多线程编程的示例代码
2010-07-08 11:00
253 查看
先来看看使用Thread类来实现多线程,示例代码如下:
注意:
可以通过workerThread.Priority = ThreadPriority.X设置线程的优先级。
ThreadPriority是个枚举类型,包括:Highest,AboveNormal,Normal,BelowNormal和Lowest。
一般当前线程(Thread.CurrentThread)被默认设置成Normal。
不过如今的CPU都已经相当的快了,上例中即便把workerThread.Priority = ThreadPriority.Highest;当输入的数字很小,譬如输入1,也就是运算量较小的时候,主线程也能顺利的抢在Work线程之前完成任务的。但是随便interval设置值增大,情况就有所不同了。
再来看看如何使用ThreadPool创建线程:
使用Thread类来创建线程是很昂股的(CPU密集型)。所以CLR提供了线程池来供应用程序使用,演示代码如下:
注意:
使用WaitCallback委托时还可以传送一个参数,例如把上面的代码改成:
ThreadPool.QueueUserWorkItem(new WaitCallback(StartMethod), "First Thread");
Thread.Sleep(100);
ThreadPool.QueueUserWorkItem(new WaitCallback(StartMethod), "Second Thread");
Console.ReadLine();
接着在StartMethod里可以使用它,例如;
static void StartMethod(Object stateInfo)
{
//DisplayNumbers("Thread " + DateTime.Now.Millisecond.ToString());
DisplayNumbers("Thread " + stateInfo.ToString());
Console.WriteLine("Thread Finished");
}
using System; using System.Threading; namespace ConsoleApplication1 { class EntryPoint { static int interval; static void Main() { Console.Write("Interval to display results at?> "); interval = int.Parse(Console.ReadLine()); Thread thisThread = Thread.CurrentThread; thisThread.Name = "Main Thread"; ThreadStart workerStart = new ThreadStart(StartMethod); Thread workerThread = new Thread(workerStart); workerThread.Name = "Worker"; // workerThread.Priority = ThreadPriority.Highest; workerThread.Start(); DisplayNumbers(); Console.WriteLine("Main Thread Finished"); Console.ReadLine(); } static void StartMethod() { DisplayNumbers(); Console.WriteLine("Worker Thread Finished"); } static void DisplayNumbers() { Thread thisThread = Thread.CurrentThread; string name = thisThread.Name; Console.WriteLine("Starting thread: " + name); Console.WriteLine(name + ": Current Culture = " + thisThread.CurrentCulture); for (int i = 1; i <= 8 * interval; i++) { if (i % interval == 0) Console.WriteLine(name + ": count has reached " + i); } } } }
注意:
可以通过workerThread.Priority = ThreadPriority.X设置线程的优先级。
ThreadPriority是个枚举类型,包括:Highest,AboveNormal,Normal,BelowNormal和Lowest。
一般当前线程(Thread.CurrentThread)被默认设置成Normal。
不过如今的CPU都已经相当的快了,上例中即便把workerThread.Priority = ThreadPriority.Highest;当输入的数字很小,譬如输入1,也就是运算量较小的时候,主线程也能顺利的抢在Work线程之前完成任务的。但是随便interval设置值增大,情况就有所不同了。
再来看看如何使用ThreadPool创建线程:
使用Thread类来创建线程是很昂股的(CPU密集型)。所以CLR提供了线程池来供应用程序使用,演示代码如下:
using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ThreadPool2 { class Program { static int interval; static void Main(string[] args) { Console.Write("Interval to display results at?> "); interval = int.Parse(Console.ReadLine()); ThreadPool.QueueUserWorkItem(new WaitCallback(StartMethod)); Thread.Sleep(100); ThreadPool.QueueUserWorkItem(new WaitCallback(StartMethod)); Console.ReadLine(); } static void StartMethod(Object stateInfo) { DisplayNumbers("Thread " + DateTime.Now.Millisecond.ToString()); Console.WriteLine("Thread Finished"); } static void DisplayNumbers(string GivenThreadName) { Console.WriteLine("Starting thread: " + GivenThreadName); for (int i = 1; i <= 8 * interval; i++) { if (i % interval == 0) { Console.WriteLine("Count has reached " + i); Console.WriteLine("CurrentCulture: " + Thread.CurrentThread.CurrentCulture.ToString()); Console.WriteLine("IsThreadPoolThread: " + Thread.CurrentThread.IsThreadPoolThread.ToString()); Console.WriteLine("ManagedThreadId: " + Thread.CurrentThread.ManagedThreadId.ToString()); Console.WriteLine("Priority: " + Thread.CurrentThread.Priority.ToString()); Console.WriteLine("ThreadState: " + Thread.CurrentThread.ThreadState.ToString()); Thread.Sleep(1000); } } } } }
注意:
使用WaitCallback委托时还可以传送一个参数,例如把上面的代码改成:
ThreadPool.QueueUserWorkItem(new WaitCallback(StartMethod), "First Thread");
Thread.Sleep(100);
ThreadPool.QueueUserWorkItem(new WaitCallback(StartMethod), "Second Thread");
Console.ReadLine();
接着在StartMethod里可以使用它,例如;
static void StartMethod(Object stateInfo)
{
//DisplayNumbers("Thread " + DateTime.Now.Millisecond.ToString());
DisplayNumbers("Thread " + stateInfo.ToString());
Console.WriteLine("Thread Finished");
}
相关文章推荐
- 关于C#多线程、网络编程与计时器Timer的一点使用心得
- 关于C# 将DataGridView数据拖动到picturebox代码示例
- 并发危险:解决多线程代码中的 11 个常见的问题(C#示例) from MSDN
- C#中构建多线程应用程序[转] ----代码示例
- C#中一道关于多线程的编程题
- C#中关于委托和事件的示例代码
- C# 多线程的控制代码示例
- [转]c#编程更改水晶报表中公式字段示例代码 [http://blog.csdn.net/xwdd129/archive/2006/05/29/760661.aspx]
- C#中关于泛型方法和泛型委托的示例代码
- 多线程编程之PV操作示例代码
- 【面向对象语言系列】关于 C# 多线程编程,你需要知道的事
- 关于Java中多线程死锁的代码示例
- 关于VS2005中C#代码用F12转到定义时,总是显示从元数据的问题
- 关于c#书的代码
- default 关键字泛型代码中的默认关键字(C# 编程指南)
- 【编程题目】求单向链表的倒数第k个节点——关于代码鲁棒性的探讨(C++实现)
- 【转】Asp.net 2.0 文件下载[支持多线程, 断点续传功能](示例代码下载)
- c#后台修改前台DOM的css属性示例代码
- [转]c# 多线程 编程
- C#编程总结(二)多线程基础