zoukankan
html css js c++ java
VS.Net IDE 与 csc.exe 各自生成的 exe 在某些特殊情况下竟然有区别?!
/**/
/*
我有一个习惯将一些好的代码片断我都单独保存到 .cs 文件中
,测试运行时,我自己亲自 csc.exe 生成 exe!
下面这段代码是我从 VS.Net 运行测试正常后保存到一个 .cs 文件中的
,在 EditPlus 中稍作修改,然后手动执行命令行:
csc.exe xxx.cs
后,双击运行 xxx.exe 运行,竟然不能按期望正常结束!
开始以为是代码问题 (因为用到了 ThreadPool),后来竟然发现:
同样是这一段代码在 VS.Net 运行且 build 的 exe 都未见异常!
然而由命令行 csc.exe xxx.cs 生成的 xxx.exe 运行就是死循环不能正常结束!
另外 如果把 "foreach 循环" 都换为 "for 循环" 也没问题了!
另外 如果都换成 static 成员也没问题了!
其实我并不特想较真儿!但还是忍不住贴出来,请教大家一下!
这到底是:
1."VS.Net IDE Build & Run" 与 "csc.exe 命令行 make & run" 的区别
(VS.Net IDE Build & Run 也就是 多了一个 Project 和 AssemblyInfo.cs ,really? 请教)
(Reflector 粗看各自 dasm 后的代码没啥区别)
2."foreach 循环" 与 "for 循环" 的区别
3. "static 成员" 与 "instance 成员" 的区别
注意:以上都是在"多线程编程"的前提下!因为用到了 ThreadPool!
*/
//
测试程序
namespace
Test
{
using
System;
using
System.Threading;
public
class
State
//
用于保存状态
{
public
int
_i
=
0
;
public
string
_s;
public
State(
int
i,
string
s)
{
this
._i
=
i;
this
._s
=
s;
}
}
class
ConsoleApplication
{
//
private static object _SyncLockObject = new object();
private
int
_ConcurrentThreadsCount
=
3
;
//
允许并发线程数为 3
private
int
I;
//
初值是总的循环次数,用于同步 递减
private
int
i
=
0
;
//
用于控制并发线程数
private
int
k
=
0
;
//
线程计数器 递增
static
void
Main()
{
ConsoleApplication a
=
new
ConsoleApplication();
a.Run();
System.Console.ReadLine();
}
public
void
Run()
{
string
[] URLs
=
new
string
[]
{
"
http://dzh.mop.com/topic/rss.jsp?type=1
"
,
"
http://dzh.mop.com/topic/rss.jsp?type=2
"
,
"
http://dzh.mop.com/topic/rss.jsp?type=3
"
,
"
http://dzh.mop.com/topic/rss.jsp?type=4
"
//
,"
http://rss.sina.com.cn/news/allnews/auto.xml
"
//
,"
http://rss.sina.com.cn/news/allnews/auto.xml
"
}
;
this
.I
=
URLs.Length;
//
初值是总的循环次数,用于同步 递减
//
大家注意这里
//
现在遇到一个怪问题:
//
同样一段代码在 VS.Net 运行就没问题! 然而在 一个 .cs 文件中 csc 生成的 exe 就是死循环?
//
另外 如果把 foreach 都换为 for 也没问题了!?
//
for(int x = 0; x < URLs.Length; x ++)
foreach
(
string
s
in
URLs)
{
while
(
this
.i
>=
this
._ConcurrentThreadsCount)
//
控制线程并发数为 _ConcurrentThreadsCount 个
{
//
等待有线程结束跳出死循环,再启动新线程,加入 QueueUserWorkItem
}
//
lock (_SyncLockObject)
{
this
.i
++
;
this
.k
++
;
//
线程计数器
}
//
foreach 循环请用下句代码
ThreadPool.QueueUserWorkItem(
new
WaitCallback(ThreadProcess),
new
State(
this
.k, s));
//
for 循环请用下句代码
//
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProcess), new State(this.k, URLs[x]));
}
while
(
this
.I
>
0
);
//
如果 I == 0 就说明所有线程都已经结束
this
.k
=
0
;
//
清零
//
如果 Console 看到 End 就说明正常结束!
//
在 VS.Net 中运行就可以看到下面 这句话
//
但是 csc.exe AutoRss.cs 生成 AutoRss.exe 就有问题根本运行不到这里
System.Console.WriteLine(
"
\n如果你能看到这句话,估计你是 VS.Net 里运行,属于正常!
"
);
}
public
void
ThreadProcess(
object
o)
{
State state
=
((State) o);
//
lock (_SyncLockObject)
{
this
.i
--
;
this
.I
--
;
}
System.Console.WriteLine(
"
end {0}/{1}
"
, state._i,
this
.I);
}
}
}
查看全文
相关阅读:
LCT男人八题系列
hadoop 伪分布启动-fs格式化
hadoop 安装
Scala Actor入门
Scala 隐式转换和隐式参数
Scala 类型参数
Scala 类型参数
Scala 匹配模式
scala 函数式编程之集合操作
Scala 函数式编程
原文地址:https://www.cnblogs.com/Microshaoft/p/134562.html
最新文章
Netty笔记(5)
Netty笔记(4)
Java 数据0小数点前无显示
query did not return a unique result
hibernate null value is assigned to a property of primitive type setter
利用反射处理多个表结构相同的数据的查询和数据库表的关联
oracle geoserver ora-13226
sql删除数据
sql server 向oracle导入表
向sql server 导入数据库
热门文章
数据库批量修改表名,增加前缀(SQL server)
CodeForces 449D(容斥,DP
POJ 2686(状压DP
POJ 2566(尺取法
POJ 3662(最短路,二分
POJ 2010(二分
POJ 2010 (优先队列
POJ 3579,poj 3685解题记录
POJ 1065 学习写法
POJ 3046 DP
Copyright © 2011-2022 走看看