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);
}
}
}
查看全文
相关阅读:
Django 用ModelForm批量保存form表单(非常实用的方法) mfor_verity项目
jquery ajax异步提交表单数据的方法
python字符串转换成变量的几种方法
django 线上线下使用不同的数据库 上线:mysql 线下sqlite3 以及debug模式的开和关
django admin 或xdmin list_display search_fields list_filter 如果显示搜索外键或多对多字段
nonce和timestamp在Http安全协议中的作用
Web API接口 安全验证
.Net环境下的缓存技术介绍
.Net缓存管理框架CacheManager
在asp.net web api中利用过滤器设置输出缓存
原文地址:https://www.cnblogs.com/Microshaoft/p/134562.html
最新文章
linux arp攻击解决方法 测试很有效
linux下重新定位SVN URL方法
MYSQL服务器复制配置
查看linux服务器硬盘IO读写负载
CentOS下php安装mcrypt扩展
CentOS 6.3下MySQL 5.6源码安装
CSS3实现0.5px的边框
隐藏的Swiper显示后无法获取正确的宽度和高度
js学习笔记21----表格操作
js学习笔记20----addClass,removeClass函数封装
热门文章
font-face自定义字体
js学习笔记19----getElementsByClassName函数封装
js学习笔记18----元素创建操作
js学习笔记17----元素的各种位置,尺寸
js学习笔记16----父节点的操作
js学习笔记15----子节点和兄弟节点的操作
python 合并字典,相同 key 的 value 如何相加?
Jquery 禁用元素的所有属性
jquery input切换编辑和不可编辑模式,input自动获得焦点,遍历所有的子类标签
jquery 替换原来的html内容
Copyright © 2011-2022 走看看