您的位置:首页 > 编程语言 > C#

C#中关于多线程编程的示例代码

2010-07-08 11:00 253 查看
先来看看使用Thread类来实现多线程,示例代码如下:

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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: