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);
}
}
}
查看全文
相关阅读:
js 函数 常用事件 document事件 window对象
Java API Object
Java 匿名对象 内部类 包的声明与访问 访问修饰符
Java关键字 this super final static
Java 多态 构造方法
Java 抽象类 接口
Java Server Pages----JSP
JAVA Web -----Servlet简介
JAVA web 会话技术Cookie&Session
JAVA中常用的API -----(一)Object、String类
原文地址:https://www.cnblogs.com/Microshaoft/p/134562.html
最新文章
Java 多线程 简单实例 (Thread)
Java中的异常处理(三)
Java中的异常处理(二)
Java中的异常处理(一)
Clone中存在的浅克隆问题
对象克隆实例
tarjan学习笔记
Luogu 3197 越狱
乘法逆元(updating)
Luogu 1833 樱花
热门文章
Luogu 1776 宝物筛选
Luogu 1941 飞扬的小鸟
Luogu 1541 乌龟棋
Luogu 2822 组合数问题
Luogu 1313 计算系数
Luogu 1019 单词接龙
Java List接口
Java 增强for循环 泛型
Java的集合、Iterator迭代器
html 框架使用
Copyright © 2011-2022 走看看