WriteLine会阻塞子线程运行

Imcx 2016-07-07 12:19:45

static void Main(string[] args)
{
foreach (var ore in ores)
{
new Thread(() => {Method1();}) {IsBackground = true }.Start();
}

Console.ReadKey();
}

static void Method1()
{
for (int i = 0; i < pages; i++)
{
if(...)
Method2();
else
Console.WriteLine("错误");
}
}


static void Method2()
{
foreach (var item in items)
{
//这里是工作细节
Console.WriteLine("工作日志");//注释这里可以完成工作
}
}


这是一个控制台程序

最开始的ores有2个元素,如果不注释最里面的Console.WriteLine那么只会运行两次,每次对应最外层的ores的第一次工作,然后程序就停止了。。。理论上来说会打印出1000+条日志,注释最里面的Console.WriteLine是可以执行的,主要是为了有一个运行进度的反馈
...全文
555 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
D56233577 2016-07-08
  • 打赏
  • 举报
回复
没有异常?程序崩了?
Imcx 2016-07-08
  • 打赏
  • 举报
回复
关于输出的字符的值的问题麻烦看下#17、#18的对比图,引用的两个变量都不是null,并且在#27里是可以输出 所以我说东西发复杂一点,一般人就不会认真看了,于是我在#1里的提问就比较简单
Imcx 2016-07-08
  • 打赏
  • 举报
回复
引用 30 楼 hemowolf 的回复:
不认为是 Console.WriteLine 的阻塞,而是里面的字符串生成造成的 楼主你在 Console.WriteLine 之前先生成字符串,再把这个字符串传进去试试: string line = "售价:" + reportLog.ProductPrice + ",销量:" + reportLog.Salenum; Console.WriteLine(line); 估计这样会卡在 string line = .... 这个地方
大哥,麻烦你看下你上面那一楼
小灰狼 2016-07-08
  • 打赏
  • 举报
回复
不认为是 Console.WriteLine 的阻塞,而是里面的字符串生成造成的 楼主你在 Console.WriteLine 之前先生成字符串,再把这个字符串传进去试试: string line = "售价:" + reportLog.ProductPrice + ",销量:" + reportLog.Salenum; Console.WriteLine(line); 估计这样会卡在 string line = .... 这个地方
Imcx 2016-07-08
  • 打赏
  • 举报
回复
这一步跟上一步做对比,debug类的输出没有被执行,说明就是在Console.WriteLine这里被“阻塞”(这个只是我的形容,不要太较真


Imcx 2016-07-08
  • 打赏
  • 举报
回复
根据楼上的几位大神的回复可以发现 1.Console.WriteLine不是一个简单的输出函数 2.高并发的情况下会发生类似“死锁”一样的现象 这个应该是Console.WriteLine内部的问题,不知道哪里可以查看一下这些系统函数的源码?
Imcx 2016-07-08
  • 打赏
  • 举报
回复
引用 21 楼 shingoscar 的回复:
那再看看Console.Out
在程序刚启动的时候,和线程里,是不是同一个对象


引用 25 楼 zanfeng 的回复:
高并发的情况下会有这个问题。自己也没有解决。现在不用这个输出了。windebug 调试的时候也可以用debug类输出



参靠了一下二位的意见,做了一个测试
图中我将断点取消了并点击了继续


足球中国 2016-07-08
  • 打赏
  • 举报
回复
高并发的情况下会有这个问题。自己也没有解决。现在不用这个输出了。windebug 调试的时候也可以用debug类输出
小灰狼 2016-07-08
  • 打赏
  • 举报
回复
本人感觉,Console.WriteLine 不会阻塞,但是你在 WriteLine 里引用到了 reportLog.ProductPrice, reportLog.Salenum 怀疑是你的 reportLog 在得到这两个属性时被阻塞了,先把这两个变量改为常量试试
Imcx 2016-07-08
  • 打赏
  • 举报
回复
解决方法:
#5中第一个代码块static void Main(string[] args)的foreach里那个线程前加了一个Console.WriteLine,里面随便输出点啥


Imcx 2016-07-08
  • 打赏
  • 举报
回复
刚刚解决了这个问题,但我仍然不知道原因,如果日后有人看到希望告诉我一声
Imcx 2016-07-08
  • 打赏
  • 举报
回复
引用 33 楼 D56233577 的回复:
没有异常?程序崩了?
没有异常,查询也没有崩,控制台上的光标在闪动可以说明这些
小灰狼 2016-07-08
  • 打赏
  • 举报
回复
楼主,你是所有的控制台输出都会卡死,还是只在这一个地方卡死? 记得以前我也出现过类似问题,有12年了吧,当时的控制台窗口是编辑状态的,也就是鼠标在窗口里点一下之后,处于让用户选择窗体内字符串的状态,这时应用程序是无法向窗体输出的。这时只要在控制台窗口上点下右键就可以了。或者在控制台窗口的标题栏里点右键 -> 属性 -> 选项,把“快速编辑模式”的复选框取消。 不知道楼主是不是属于这种情况
  • 打赏
  • 举报
回复
c#是一个比较严谨的强类型编程平台,vs也是很好的调试工具,.net 也是充分保护安全的运行平台。 当你把有用的信息都掩盖起来,你无法用代码重现问题时,然后问一个诡异的问题,这就该从编程“人品”上来分析 bug 机制了。
  • 打赏
  • 举报
回复
贴一个可编译通过的代码出来。
Poopaye 2016-07-07
  • 打赏
  • 举报
回复
看不懂你在说啥 WriteLine不会阻塞线程就对了
leisiege 2016-07-07
  • 打赏
  • 举报
回复
console。write本身就是多线程的。因为怕好几个命令一起发。就乱了。
Poopaye 2016-07-07
  • 打赏
  • 举报
回复
Poopaye 2016-07-07
  • 打赏
  • 举报
回复
话说你在刚开始的时候有用到Console.WriteLine么? 不至于完全没有输出任何东西
Poopaye 2016-07-07
  • 打赏
  • 举报
回复
那再看看Console.Out 在程序刚启动的时候,和线程里,是不是同一个对象
加载更多回复(16)

111,128

社区成员

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

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

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