如何判断两段代码运行时是否是在同一个线程?

chnking 2009-05-10 12:15:59
在一个appdomain内,开了多少线程不清楚。
在这个appdomain内有两段代码,它们执行时,如何能它们判断是否是在同一个线程内执行的?
使用Thread.CurrentThread.ManagedThreadId吗?
...全文
921 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
深夜情感老师 2009-05-14
  • 打赏
  • 举报
回复
都这么强啊
zhensoft163 2009-05-10
  • 打赏
  • 举报
回复
ManagedThreadId获得是线程的唯一标识
我姓区不姓区 2009-05-10
  • 打赏
  • 举报
回复
能不能直接判断当前线程的Name?

static void Main(string[] args)
{
Thread th1 = new Thread(o => { Method1(); Method2(); }) { Name = "th1" };
Thread th2 = new Thread(o => { Method1(); }) { Name = "th2" };
Thread th3 = new Thread(o => { Method2(); }) { Name = "th3" };
th1.Start();
th2.Start();
th3.Start();
Console.Read();
}
static void Method1()
{
Console.WriteLine(Thread.CurrentThread.Name);
}

static void Method2()
{
Console.WriteLine(Thread.CurrentThread.Name);
}
gomoku 2009-05-10
  • 打赏
  • 举报
回复
对于托管世界来说,是唯一标识。


但托管线程不一定和操作系统线程是一对一的关系。
虽然机会很少,但存在可能使得一个托管线程用了多个操作系统线程,也有可能多个托管线程同用了一个操作系统线程。
chnking 2009-05-10
  • 打赏
  • 举报
回复
ManagedThreadId获得是线程的唯一标识吗?
ManagedThreadId值一样就表示一定是同一个线程了吗?
yooyoozoo 2009-05-10
  • 打赏
  • 举报
回复
我也这样认为的!
gomoku 2009-05-10
  • 打赏
  • 举报
回复
我认为可以用Thread.CurrentThread.ManagedThreadId
修改一下昵称 2009-05-10
  • 打赏
  • 举报
回复
up
mmbf001 2009-05-10
  • 打赏
  • 举报
回复
....马克
xudongdong1990 2009-05-10
  • 打赏
  • 举报
回复
我认为可以用Thread.CurrentThread.ManagedThreadId
sushou2009 2009-05-10
  • 打赏
  • 举报
回复
UP7L!很好很强大!
wuyq11 2009-05-10
  • 打赏
  • 举报
回复
获得当前线程的名称,可以使用静态属性Thread.CurrentThread,获取当前线程的Thread实例,访问Name属性,进行读取访问。
线程也有一个托管的线程ID,可以用ManagedThreadId属性读取它。
参考
llsen 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gomoku 的回复:]
我认为可以用Thread.CurrentThread.ManagedThreadId
[/Quote]

都加这段代码
然后看看这是的线程就可以了饿
哈哈潜伏哥 2009-05-10
  • 打赏
  • 举报
回复
private void button4_Click(object sender, EventArgs e)
{
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadTest));
thread.Name = "线程1的名字";
thread.Start();

}
private void ThreadTest()
{
MessageBox.Show(System.Threading.Thread.CurrentThread.Name);
}

除了获取线程ID以外,可以指定线程的名字,用来区别于其他线程的哈,因为用线程ID不能具体知道是什么线程,所以用线程名字更科学一些。

楼主可以测试一下上面的代码,我测试通过了。
蓝海D鱼 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zzxap 的回复:]
C# code
System.Threading.Parallel 提供了几种实用的循环并行处理方法,让我们可以用非常简便的代码完成并发处理。

1. For
var datas = new[] { "a", "b", "c" };

Parallel.For(0, datas.Length, i =>
{
var s = datas[i];
Console.WriteLine(">>> Thread:{0}, {1}", Thread.CurrentThread.ManagedThreadId, s);
});

输出:
>>> Thread:3, a
>>> Thread:7, b
>>> Thread:5, c

我们还可以像 for(;; i…
[/Quote]up
ws_hgo 2009-05-10
  • 打赏
  • 举报
回复
LS很强大
学习啦
zzxap 2009-05-10
  • 打赏
  • 举报
回复
[code=C#]
System.Threading.Parallel 提供了几种实用的循环并行处理方法,让我们可以用非常简便的代码完成并发处理。

1. For
var datas = new[] { "a", "b", "c" };

Parallel.For(0, datas.Length, i =>
{
var s = datas[i];
Console.WriteLine(">>> Thread:{0}, {1}", Thread.CurrentThread.ManagedThreadId, s);
});

输出:
>>> Thread:3, a
>>> Thread:7, b
>>> Thread:5, c

我们还可以像 for(;; i += 2) 那样指定循环递增幅度。
var datas = new[] { "a", "b", "c", "d", "e" };

Parallel.For(0, datas.Length, 2, i =>
{
var s = datas[i];
Console.WriteLine(">>> Thread:{0}, {1}", Thread.CurrentThread.ManagedThreadId, s);
});

for (int i = 0; i < datas.Length; i += 2)
{
Console.WriteLine(datas[i]);
}

输出:
>>> Thread:3, a
>>> Thread:7, e
>>> Thread:4, c
a
c
e

For() 还提供了更多更复杂的重载,包括提供 init、finally、state 等操作。

比如,我们可以通过调用 ParallelState.Stop() 来停止后续处理。
var datas = new[] { "a", "b", "c", "d", "e" };

Parallel.For(0, datas.Length, (i, state) =>
{
state.Stop();

var s = datas[i];
Console.WriteLine(">>> Thread:{0}, {1}",
Thread.CurrentThread.ManagedThreadId, s);
});

输出:
>>> Thread:3, a
>>> Thread:7, b
>>> Thread:5, c

还可以像下面这样,添加初始化、结束处理委托,并传递额外的参数给并行代码。
var datas = new[] { "a", "b" };

Parallel.For<int>(0, datas.Length,
() =>
{
Console.WriteLine("Init {0}...", Thread.CurrentThread.ManagedThreadId);
return 123;
},
(i, state) =>
{
state.Stop();

var s = datas[i];
Console.WriteLine(">>> Thread:{0}, {1}, {2}",
Thread.CurrentThread.ManagedThreadId, s, state.ThreadLocalState);
},
(x) =>
{
Console.WriteLine("Finally {0}, {1}...", Thread.CurrentThread.ManagedThreadId, x);
});

输出:
Init 3...
Init 5...
>>> Thread:3, a, 123
>>> Thread:5, b, 123
Finally 3, 123...
Finally 5, 123...

2. Foreach

ForEach() 和 For() 的用法非常类似。
var datas = new[] { "a", "b", "c", "d", "e" };

Parallel.ForEach(datas, s =>
{
Console.WriteLine(">>> thread:{0}, {1}",
Thread.CurrentThread.ManagedThreadId, s);
});

输出:
>>> thread:3, a
>>> thread:6, b
>>> thread:5, c
>>> thread:6, e
>>> thread:7, d

作者善解人意,同样提供了多种重载,包括获取索引位置以及并发状态管理等等。
var datas = new[] { "a", "b", "c", "d", "e" };

Parallel.ForEach(datas, (s, i, state) =>
{
Console.WriteLine(">>> thread:{0}, index:{1}, {2}",
Thread.CurrentThread.ManagedThreadId, i, s);
});

输出:
>>> thread:3, index:0, a
>>> thread:7, index:3, d
>>> thread:6, index:2, c
>>> thread:7, index:4, e
>>> thread:5, index:1, b

3. Invoke

Invoke 针对的是 "并发逻辑" 而非 "并发数据"。当然,我们也可以将 "并发逻辑" 打包成数据集合(Delegate[]) 提交给 For/Foreach 执行,只不过 Invoke 更简便一些。
Parallel.Invoke(new Action[]
{
() => Console.WriteLine(">>> thread:{0}, {1}", Thread.CurrentThread.ManagedThreadId, 1),
() => Console.WriteLine(">>> thread:{0}, {1}", Thread.CurrentThread.ManagedThreadId, "a"),
() => Console.WriteLine(">>> thread:{0}, {1}", Thread.CurrentThread.ManagedThreadId, typeof(object)),
});

输出:
>>> thread:3, 1
>>> thread:5, System.Object
>>> thread:4, a

改用 TPL / Invoke 写蜘蛛(Spider/Crawler)抓取代码,可以大大简化代码样式,少了许多线程管理调度
[/CODE]

111,098

社区成员

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

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

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