关于C#线程运行的问题,求support!

yang_brest 2018-03-23 11:36:44
写了一个简单的线程执行的代码,执行过程好晕啊,
单步调试运行到打印语句1,程序进入子线程的方法2,当运行到打印语句3时,终端才显示1中的信息;语句3执行结束返回4,终端才显示打印语句3的内容。
这是什么运行过程?
求大家帮忙指点一下,此类线程执行过程是怎样的?打印语句执行后为什么不能正常直接显示?谢谢!

namespace merge
{
class merges
{
public static void Main(String[] args)
{
Console.WriteLine("hahng");
Thread t = new Thread(new ThreadStart(run));
t.Start();
Console.WriteLine("ping"); ------1
Console.ReadLine(); -----4
}

public static void run() -------2
{
pong();
}

private static void pong() {
Console.WriteLine("pong"); -------3
}

}
}
...全文
215 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
网上垃圾工具成百上千,但是关键地在于你自己的理念和工程方法。那些工具作用不大,基本上都是为了让你掏钱,而工具其实越是实用、许多人越不理解——因为他只想要免费的结果而不注重过程。要知道开发是个创造性工作,不是买卖,根本不可能靠工具。
  • 打赏
  • 举报
回复
多线程并发程序没法手动跟踪调试。开发这类程序,自己写测试用例,自己写测试程序,比如说先用顺序方法运行一遍测试用例,再打乱次序运行10遍测试用例,然后再用几百个线程并发执行测试用例。好的质量是自动测试出来的,不是手动调试出来的。
  • 打赏
  • 举报
回复
引用 3 楼 yang_brest 的回复:
谢谢支持呀!刚刚接触多线程,看来要系统了解一下! 那对于多线程的程序,单步调试适用么?我用的是vs2008,有什么好的调试工具么?
开发软件时,并不是你启动最终程序、然后鼠标“点点点”界面去手动测试和跟踪调试。 而是你要启动你的测试引擎执行你的测试用例,当 vs 进入程序异常调试窗口的中断环境时,这时候你才查看一下调用堆栈、查看一下各层堆栈入口的变量值。如果你使用测试驱动开发方法,那么你通常不会去累赘地手动调试跟踪,而是立刻意识到 bug 的成因。因为测试驱动是"小步快跑、循序渐进”的方式的,不是埋头写代码然后出了 bug 之后才找错误的方式。
tanta 2018-03-23
  • 打赏
  • 举报
回复
1、4在一个线程,2、3在一个线程。没有同步机制的情况下,只能确定1在4前,2在3前,线程间先后顺序无法保证。
yang_brest 2018-03-23
  • 打赏
  • 举报
回复
谢谢支持呀!刚刚接触多线程,看来要系统了解一下! 那对于多线程的程序,单步调试适用么?我用的是vs2008,有什么好的调试工具么?
qq_38977664 2018-03-23
  • 打赏
  • 举报
回复
你都开了线程了运行,肯定和主线程的运行顺序不一样啊。。。。。你去了解一下多线程就知道了
exception92 2018-03-23
  • 打赏
  • 举报
回复
调试操作会挂起线程,造成程序不能继续向下执行,也就是输入操作会被阻塞,直到退出执行的方法体才显示。
yang_brest 2018-03-23
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
这是对的 1处:Console.WriteLine 是向控制台输出,会暂停当前程序,等待控制台操作结束 由于暂停,所以子线程得以执行,于是进入到2 3处又是控制台输出,自然是先到的先输出,所以你看到了 ping 4处是等待控制台输入,于是你又看到了 pong 由此可知:一个线程是在另一个线程运行的间隙中运行的 虽然线程的调度算法会比较复杂,但这一事实是不会改变的。
这个程序线程里面没加同步,可以理解线程的调度是系统自己完成的么?
xuzuning 2018-03-23
  • 打赏
  • 举报
回复
是的 你只要记住 一个线程是在另一个线程运行的间隙中运行的 就行了
yang_brest 2018-03-23
  • 打赏
  • 举报
回复
引用 11 楼 xian_wwq 的回复:
[quote=引用 3 楼 yang_brest 的回复:] 谢谢支持呀!刚刚接触多线程,看来要系统了解一下! 那对于多线程的程序,单步调试适用么?我用的是vs2008,有什么好的调试工具么?
在调试线程时,不能下断点,单步调试会直接影响线程运行 比较靠谱的方法是将相关运行数据输出到vs的output窗口或者写日志文件 [/quote] 是的,我刚才又试了下,发现单步调试输出的结果感觉是随机的,直接运行输出的结果比较稳定
xian_wwq 2018-03-23
  • 打赏
  • 举报
回复
引用 3 楼 yang_brest 的回复:
谢谢支持呀!刚刚接触多线程,看来要系统了解一下! 那对于多线程的程序,单步调试适用么?我用的是vs2008,有什么好的调试工具么?
在调试线程时,不能下断点,单步调试会直接影响线程运行 比较靠谱的方法是将相关运行数据输出到vs的output窗口或者写日志文件
清澈如湖 2018-03-23
  • 打赏
  • 举报
回复
我一般是这样做的: 1.程序打开的时候创建一个新的线程,并且一直运行,里面写上执行方法,并且使用一个变量来判断是否执行 2.主线程或者其他线程中达到触发条件的时候,将变量更改为true 3.创建的线程就会自动执行这个方法了 4.如果线程启动结束次数比较频繁,不建议每次开启一个新的,只要开启一个,使用变量来控制是不是执行实际代码就可以了,太多线程会很卡,甚至程序崩溃
清澈如湖 2018-03-23
  • 打赏
  • 举报
回复
一直使用多线程,但对于其中的原理其实并不了解,特意来学习一下
xuzuning 2018-03-23
  • 打赏
  • 举报
回复
这是对的 1处:Console.WriteLine 是向控制台输出,会暂停当前程序,等待控制台操作结束 由于暂停,所以子线程得以执行,于是进入到2 3处又是控制台输出,自然是先到的先输出,所以你看到了 ping 4处是等待控制台输入,于是你又看到了 pong 由此可知:一个线程是在另一个线程运行的间隙中运行的 虽然线程的调度算法会比较复杂,但这一事实是不会改变的。

110,567

社区成员

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

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

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