线程问题

-汪帆- 2010-03-05 09:45:22
ProcessThread和Thread有什么区别?
为什么ProcessThread有Id属性,Thread没有?
Thread有Name属性,而ProcessThread没有?
...全文
164 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
-汪帆- 2010-03-05
  • 打赏
  • 举报
回复
ProcessThread和Thread的区别在哪里呢?
MSDN对ProcessThread的解释是:使用 ProcessThread 来获取系统上当前运行的线程的信息。
但是 Process.GetCurrentProcess().Threads获取的都是ProcessThread 类型的线程。
我用Thread创建的,或是异步委托创建的线程都是Thread类型的,在这里获取不了。
yanghailun_ 2010-03-05
  • 打赏
  • 举报
回复
接 3楼贴 ,继续下面的问题:
ProcessThread有Id属性,Thread没有?
Thread有Name属性,是因为可以通过这个属性给线程赋一个友好的名称,但不要认为这个就必须要赋值...
如上面帖子,Thread 可能存活期非常长,如服务线程,所以在你下次再操作这个线程的时候,仅仅通过id还不知道这个线程是干什么的.这个时候,name就请很大作用了...呵呵..
我查看了msdn,Thread类也是有id的(我的msdn版本是vs2008附带的,可能版本不一样)...

而ProcessThread没有name,为什么没有name属性,可能只有微软知道..
可能下面的考虑,
ProcessThread存活期短,多一个属性多一个开支,所以微软就将这个属性阉了...
我在msdn帮助文档 ProcessThread类上找到这么一行文字(从 .NET Framework 2.0 版开始,很多 .NET Framework 方法和属性就已去除了引用其它计算机上的性能计数器数据的功能。此项更改提高了性能)
可以作为我猜测的辅证...可以看出ProcessThread 属性大部分都是枚举,整形等小字节属性,这个也作为一辅证吧..

csln2010 2010-03-05
  • 打赏
  • 举报
回复
修改一下上面的帖子。
进程是电脑给应用程序分的,使用IIS一般是w3wp.exe, 而每个进程中又有若干个程序域,一个站点可以算一个程序域。一个程序域内又可以建立多线程来执行不同的任务。
csln2010 2010-03-05
  • 打赏
  • 举报
回复
进程是电脑给应用程序分的,使用IIS一般是w3wp.exe, 而每个线程中又有若干个程序域,一个站点可以算一个程序域。一个程序域内又可以建立多线程来执行不同的任务。
yanghailun_ 2010-03-05
  • 打赏
  • 举报
回复
《c# 入门教程 第三版》 上有介绍。
《c# 高级编程 第四版》 第330 页也有详细说明(刚翻书查过)...

如下为转帖,讲得比较详细:
我们可以通过Thread类,一次使用一个线程,来创建和删除线程。这种方式建立和删除线程是很昂贵的(cpu密集型)。所以,CLR包含一个内置的线程池,供应用程序使用。这个线程池可以通过ThreadPool类访问。
ThreadPool类会在线程的托管池中重用已有的线程。使用完线程后,线程就会返回线程池,供以后使用。ThreadPool有25个可用的线程(每个处理器)。
使用ThreadPool类比Thread类创建线程简单的多。但是,在确定是用ThreadPool类还是Thread类创建线程时,考虑如下问题:
在达到如下目标时,应使用ThreadPool类:
要以最简单的方式创建和删除线程;
应用程序使用线程的性能要优先考虑。
在达到如下目标时,应使用Thread类:
要控制所创建线程的优先级;
希望所使用的线程维护其标识,该标识要与线程一起进行各种操作,经过许多不同的时间段;
所使用的线程的寿命较长。
ThreadPool的调用需要调用ThreadPool.QueueUserWorkItem()方法。调用这个方法有两种方式。一种是:
ThreadPool.QueueUserWorkItem(new WailtCallback(StartMethod));
二是:
ThreadPool.QueueUserWorkItem(StartMethod);
xingyuebuyu 2010-03-05
  • 打赏
  • 举报
回复
这个是获取当前线程的ID
System.Threading.Thread.CurrentThread.ManagedThreadId
-汪帆- 2010-03-05
  • 打赏
  • 举报
回复
进程,线程方面熟悉的大侠帮忙解释下啊..
xingyuebuyu 2010-03-05
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

System.Threading.Thread td = new System.Threading.Thread(work);
td.Start();
System.Diagnostics.ProcessThreadCollection ptc = System.Diagnostics.Process.GetCurrentProcess().Threads;
foreach (System.Diagnostics.ProcessThread pt in ptc)
{
Console.WriteLine("ProcessThread "+pt.Id.ToString());
}

}

void work()
{
while (true)
{
Application.DoEvents();
Console.WriteLine("thread " + AppDomain.GetCurrentThreadId().ToString());

}
}
}
}


使用AppDomain.GetCurrentThreadId可以获取到你创建的Thread ID,这个和ProcessThread的ID是一样的,它们是非托管系统中的ID,
System.Threading.Thread.CurrentThread.ManagedThreadId,是托管系统中的唯一标识符ID,两者是不一样的
-汪帆- 2010-03-05
  • 打赏
  • 举报
回复
是否和托管非托管有关呢?

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧