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

chnking 2009-05-10 12:15:59
在一个appdomain内,开了多少线程不清楚。
在这个appdomain内有两段代码,它们执行时,如何能它们判断是否是在同一个线程内执行的?
使用Thread.CurrentThread.ManagedThreadId吗?
...全文
1001 17 打赏 收藏 转发到动态 举报
写回复
用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]
内容概要:本文围绕配电网两阶段鲁棒故障恢复问题展开研究,基于Matlab代码实现了对IEEE顶刊论文的复现,系统构建了包含两阶段鲁棒优化模型与确定性模型在内的完整故障恢复框架。研究聚焦于提升故障后配电网的供电可靠性与恢复能力,通过第一阶段的网络重构与资源预调度,以及第二阶段对不确定性因素(如负荷波动、分布式电源出力间歇性)的动态响应,实现供电快速恢复与负荷损失最小化。采用鲁棒优化方法有效处理系统不确定性,保障运行方案的安全性与可行性,并提供完整的仿真代码与实验结果,验证了所提模型在复杂场景下的有效性与先进性。; 适合人群:具备电力系统分析基础、熟悉Matlab编程环境,从事配电网优化运行、故障恢复策略、鲁棒优化建模等方向的研究生、科研人员及电力系统工程技术人员。; 使用场景及目标:① 掌握配电网故障恢复中两阶段鲁棒优化的建模思想与数学表达;② 复现并验证高水平期刊论文中的优化算法,支撑科研仿真与方法对比;③ 应用于实际配电系统应急恢复方案设计,提升面对突发故障的自愈能力与运行韧性。; 阅读建议:建议结合Matlab代码逐模块调试运行,重点关注YALMIP工具箱调用、两阶段优化问题的建模结构与列与约束生成(C&CG)算法的实现流程,深入理解鲁棒对等转化机制,并可进一步拓展至主动配电网、高比例可再生能源接入等复杂应用场景的适应性研究。
源码下载地址: https://pan.quark.cn/s/1e5deb07fd7f **RADTools 2安装文件说明**RADTools 2是一款为游戏开发者和爱好者量身打造的软件,其核心功能在于处理游戏环境中的BAK文件。BAK文件是众多游戏中采用的一种数据存储方案,通常承载着游戏的各种元素,包括图像、声音、动画以及剧本等资料。借助RADTools 2,用户可以轻松地解包这些BAK文件,进而对文件内的内容进行查看、编辑或导出,这一过程对于游戏调试、MOD开发或深入探究游戏构造具有显著的辅助作用。**BAK文件解包过程**BAK文件采用压缩格式,旨在节省存储空间并确保游戏资源不被随意篡改。RADTools 2内置的解包机制能够将BAK文件转换回其初始的数据形态,使用户得以洞察每个资源的详细构成。解包操作通常自动化完成,用户只需选定相应的BAK文件,再借助RADTools 2的图形界面进行操作,即可实现解包,无需具备专业的编程知识。**封包视频预览功能**RADTools 2不仅具备基础的解包能力,还支持对封包视频的预览。部分游戏为了优化存储效率,会将视频文件整合在BAK文件内。借助这一工具,用户可以直接预览这些内置的视频内容,无需事先进行解包。这一特性对于游戏开发者而言,意味着可以在开发环境中即时评估视频素材的表现。**简易安装与操作**"RADTools 2原生安装包"代表了该软件提供了高效的安装体验。用户只需获取并启动`RADTools_2.exe`,遵循安装向导的指引操作,即可在个人计算机上顺利完成RADTools 2的部署。安装后,用户可以直接通过软件界面启动RADTools 2,无需进行额外的系统设置,充分展现了其便捷性和用户友好设计。**可能...

111,130

社区成员

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

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

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