【文章标题】: 乱涂C#多线程01
【文章作者】: 有酒醉
【作者邮箱】:
wuqr32@sina.com
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一、托管线程和非托管线程(Thread/ProcessThread)
可以说任何一个托管程序都是多线程,即便你认为你在处理的仅仅是一个线程.而一个非托管线程的的确确就是一线程.我们分别创建托管线程和非托管线程, 来观察一下结果.
1、托管线程
//
HelloWorld.cs
//
Author by Yzl
using
System;
public
class
HelloWorld
...
{ public static void Main(string[] args) ...{ Console.WriteLine("Hello World!"); Console.ReadLine(); } }
编译运行:
D:/>csc HelloWorld.cs
Microsoft (R) Visual C# .NET 编译器版本 7.10.6001.4
用于 Microsoft (R) .NET Framework 版本 1.1.4322
版权所有 (C) Microsoft Corporation 2001-2002。保留所有权利。
D:/>HelloWorld
Hello World!
打开任务管理器查看它的线程数,发现是3!! 这其中有一个线程显然是我们正在执行的Main方法的线程,那么其他两个呢?
2、非托管线程
//
HelloWorld.cpp
//
Author by Yzl
#include
<
iostream
>
using
namespace
std;
int
main(
void
)
...
{ int a; cout << "Hello World!" << endl; cin >> a; }
编译运行:
D:/>cl HelloWorld.cpp /EHsc
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
HelloWorld.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.
/out:HelloWorld.exe
HelloWorld.obj
D:/>HelloWorld
Hello World!
打开任务管理器查看它的线程数,发现是1.这符合我们的逻辑!
事实上,我们可以想象出,托管程序应该还隐含着与CLR有关的内部线程以及在无用单元收集中起到专门执行析构函数的线程.所以上面的测试也没有什么好意外的.
托管线程主要分为线程池线程(ThreadPool)和非线程池线程(Thread).使用线程池线程可以不需要显示地创建线程即可完成指定的任务.关于ThreadPool其他特性,可以查看: ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemthreadingthreadpoolclasstopic.htm
/*
* * @author Yzl * * 描述:测试线程池
*/
using
System;
using
System.Threading;
public
class
ThreadPoolDemo {
public
static
void
Main(
string
[] args) {
int
maxWorkerThreads;
int
maxCompletionPortThreads; ThreadPool.QueueUserWorkItem(
new
WaitCallback(ThreadProc),
"
Hello Yzl
"
); Thread.Sleep(
1000
); ThreadPool.GetMaxThreads(
out
maxWorkerThreads,
out
maxCompletionPortThreads); Console.WriteLine(
"
线程池中辅助线程的最大数目:
"
+
maxWorkerThreads); Console.WriteLine(
"
线程池中异步 I/O 线程的最大数目:
"
+
maxCompletionPortThreads); }
public
static
void
ThreadProc(
object
o) { Console.WriteLine(o.ToString()); } }
ThreadPool.QueueUserWorkItem -- 将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
编译运行:
D:/>csc ThreadPoolDemo.cs
Microsoft (R) Visual C# .NET 编译器版本 7.10.6001.4
用于 Microsoft (R) .NET Framework 版本 1.1.4322
版权所有 (C) Microsoft Corporation 2001-2002。保留所有权利。
D:/>ThreadPoolDemo
Hello Yzl
线程池中辅助线程的最大数目:50
线程池中异步 I/O 线程的最大数目:1000
由于我的机器是双核的,所以最大辅助线程为50(非25).最大辅助线程数通过调用CorSetMaxThreads函数(mscoree.h中)可更改, 同时注意,如果将ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc),"Hello Yzl");放到Main方法最后,可能会导致没机会执行队列方法程序就 退出了.
<续>
--------------------------------------------------------------------------------
【版权声明】: 本文原创于泉州软件基地, 转载请注明作者并保持文章的完整, 谢谢!
2007年02月07日 1:24:12