• 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);
            }

        }

    }

  • 相关阅读:
    [日常] Go语言圣经-命令行参数
    [日常] Go语言圣经前言
    [日常] 搭建golang开发环境
    [日常] 研究redis未授权访问漏洞利用过程
    [日常] CentOS安装最新版redis设置远程连接密码
    [日常] Apache Order Deny,Allow的用法
    [日常] 读取队列并循环发信的脚本
    [日常] 20号日常工作总结
    [日常] SinaMail项目和技术能力总结
    [日常] MySQL的预处理技术测试
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/134562.html
Copyright © 2020-2023  润新知