大陆性a及毛片,日韩精品不卡,国产精品第四页,日韩黄在线观看,欧美三级一区二区,国产中出在线观看,日韩久久久精品

    電話(huà)

    0411-39943997

仟億科技
客服中心
  • 電話(huà)
  • 電話(huà)咨詢(xún):0411-39943997
  • 手機(jī)
  • 手機(jī)咨詢(xún):15840979770
    手機(jī)咨詢(xún):13889672791
網(wǎng)絡(luò)營(yíng)銷(xiāo) >更多
您現(xiàn)在的位置:首頁(yè) > 新聞中心 > 常見(jiàn)問(wèn)題

程序多線(xiàn)程、委托、線(xiàn)程同步舉例及解析!

作者:billionnet 發(fā)布于:2012/2/3 16:38:01 點(diǎn)擊量:

多線(xiàn)程、委托、線(xiàn)程同步舉例及解析!(里面部分內(nèi)容有問(wèn)題,敬請(qǐng)討論…………)
(其截圖和最后的exe文件可到(http://download.csdn.net/user/shuanghusun)下載)
本例子采用單線(xiàn)程,源代碼如下;如果在網(wǎng)絡(luò)資源不是很好的情況下,執(zhí)行效率可能會(huì)很低,故可以采用多線(xiàn)程!但在該例子中,有幾點(diǎn)需要注意:
一、使用委托。
C#中的控件執(zhí)行時(shí),均是主線(xiàn)程在執(zhí)行,而自己創(chuàng)建的線(xiàn)程稱(chēng)為輔助線(xiàn)程。當(dāng)在輔助線(xiàn)程中調(diào)用C#控件時(shí),這時(shí)會(huì)出現(xiàn)異常,為解決這個(gè)問(wèn)題,.net采用了委托機(jī)制。比如例子中當(dāng)在
輔助線(xiàn)程中訪(fǎng)問(wèn)richTextBox1時(shí)使用了委托。
---------------------------------------
在該例子中,當(dāng)創(chuàng)建線(xiàn)程后,然后.start(),但并不意味著線(xiàn)程已經(jīng)啟動(dòng)了,他們只是處于等
待狀態(tài),如果cpu將時(shí)間片足夠多的分配給某個(gè)線(xiàn)程,則該線(xiàn)程才啟動(dòng)。
在該例子中,為了計(jì)算線(xiàn)程結(jié)束時(shí)間,故在線(xiàn)程循環(huán)體外,需要進(jìn)一步判斷一下這幾個(gè)線(xiàn)程是
不是還“活著”,即isAlive屬性,確定這幾個(gè)線(xiàn)程都不存在時(shí),即isAlive飛屬性為false時(shí),
這時(shí)再計(jì)算一下時(shí)間當(dāng)前時(shí)間, DateTime time2 = DateTime.Now; 然后將剛執(zhí)行時(shí)的時(shí)間與
time2相減就是線(xiàn)程執(zhí)行時(shí)間了。
這種想法看似正確,但當(dāng)執(zhí)行時(shí)會(huì)出現(xiàn)假死狀態(tài),采用單步調(diào)試查錯(cuò)發(fā)現(xiàn),程序一直處在判斷
isAlive的死循環(huán)。原因就是:假如有一個(gè)線(xiàn)程處于等待狀態(tài),而當(dāng)另一個(gè)線(xiàn)程調(diào)用richTextBox1
時(shí)需要使用委托,當(dāng)?shù)诙闻袛辔袝r(shí),會(huì)讓主線(xiàn)程調(diào)用C#控件,而如果與此同時(shí)cpu將時(shí)間片分
給了某一線(xiàn)程后,該線(xiàn)程然后判斷isAlive,如果分給該線(xiàn)程的時(shí)間不夠,循環(huán)繼續(xù),(主線(xiàn)程調(diào)用)
這時(shí),主線(xiàn)程調(diào)用委托,而此時(shí),主線(xiàn)程又不斷在執(zhí)行循環(huán)……,故會(huì)造成界面卡死。
因此解決的辦法,通常有2種,一是采用lock同步,二是再創(chuàng)建一個(gè)線(xiàn)程,將死循環(huán)放在一個(gè)線(xiàn)程中。
二、使用線(xiàn)程同步。使用同步時(shí),鎖定的對(duì)象應(yīng)該是私有的object類(lèi)型的。
三、如果采用創(chuàng)建線(xiàn)程的方法,可以構(gòu)造一個(gè)方法,然后遍歷每一個(gè)已經(jīng)創(chuàng)建的線(xiàn)程,判斷isAlive屬性。
四、之后計(jì)算線(xiàn)程全部啟動(dòng)后的時(shí)間,相減就OK了!記著聲明一個(gè)全局變量,賦于ipCount!
--------
當(dāng)然,除了上述二種方法外,還可以采用第三種方法,調(diào)用InVokeRequire方法,具體如何實(shí)現(xiàn)大家可以
再討論。
本例子中的部分代碼…………

 

方法三:


//創(chuàng)建一個(gè)線(xiàn)程數(shù)組
            scanThreads = new Thread[ipCount];
            for (int i = 0; i < ipCount; i++)
            {
                //定義Scan實(shí)例
                Scan scanObj = new Scan();

                //傳遞ip地址
                scanObj.strip = subIP + "." + (start + i).ToString();
                scanObj.d = AddStatusInfoToListBox;
                //初始化線(xiàn)程實(shí)例
                scanThreads[i] = new Thread(scanObj.CheckComputer);
//計(jì)算線(xiàn)程啟動(dòng)時(shí)間時(shí)創(chuàng)建線(xiàn)程所調(diào)用的方法
while (true)
            {
                OverNum = 0;
                foreach (Thread item in scanThreads)
                {
                    if (!item.IsAlive)
                    {
                        OverNum++;
                    }
                }
                //全部結(jié)束
                if (OverNum == scanThreads.Length)
                {
                    DateTime dt = DateTime.Now;
                    TimeSpan sp = new TimeSpan(dt.Ticks - start.Ticks);
                    MessageBox.Show(sp.Milliseconds.ToString());
                    break;
                }
            }
方法二:
 lock (str)
                {
                    Form1.runum--;
                }
while (Form1.runum > 0)
            {
                
                 ;
            }
            DateTime dt = DateTime.Now;
            TimeSpan sp = new TimeSpan(dt.Ticks-time1.Ticks );
            MessageBox.Show(sp.Milliseconds.ToString());
如果需要詳細(xì)代碼,可與本人聯(lián)系??!


////采用單線(xiàn)程的完整代碼如下:


namespace ScanComputer
{public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public void AddStatusInfoToListBox(string strIP, string strHostName)
    {
        
            listBoxStatus.Items.Add(string.Format("IP地址:{0}----域名:{1}", strIP, strHostName));
       
    }
    private void buttonScan_Click(object sender, EventArgs e)
    {
        DateTime time1 = DateTime.Now;
        listBoxStatus.Items.Clear();
        //獲取IP地址范圍
        string subIP = numericUpDown1.Value.ToString() + "." + numericUpDown2.Value.ToString() + "." + numericUpDown3.Value.ToString();
        int start = Convert.ToInt32(numericUpDown4.Value);
        int end = Convert.ToInt32(numericUpDown5.Value);
        //判斷合法性
        if (end < start)
        {
            MessageBox.Show("IP地址區(qū)間不對(duì)!請(qǐng)確認(rèn)后重新輸入!");
            return;
        }
        //獲取ip地址的個(gè)數(shù)
        int ipCount = end - start + 1;
        for (int i = 0; i < ipCount; i++)
        {
            string strip=subIP + "." + (start+i).ToString();
            IPAddress ipAddress = IPAddress.Parse(strip);
            IPHostEntry hostEntry = Dns.GetHostEntry(ipAddress);
            string strHostName = hostEntry.HostName.ToString();
            AddStatusInfoToListBox(strip, strHostName);
        }
        DateTime time2 = DateTime.Now;
        TimeSpan sub = time2 - time1;
        MessageBox.Show(sub.ToString());
    }
}
}



分享到:


Copyright@ 2011-2016 版權(quán)所有:大連千億科技有限公司 遼ICP備11013762-3號(hào)   google網(wǎng)站地圖   百度網(wǎng)站地圖   網(wǎng)站地圖

公司地址:大連市沙河口區(qū)中山路692號(hào)辰熙星海國(guó)際2317 客服電話(huà):0411-39943997 QQ:2088827823 37482752

法律聲明:未經(jīng)許可,任何模仿本站模板、轉(zhuǎn)載本站內(nèi)容等行為者,本站保留追究其法律責(zé)任的權(quán)利! 隱私權(quán)政策聲明