none
BackgroundWorker RRS feed

  • 問題

  • 我寫了一個尋找範圍內IP的狀態及主機名稱等

    裡面有用到 ListView 及 backgroundWorker

    當我在Work時,若沒加上 Thread.Sleep(10);

    或是裡面的時間比10小,我的listView 就不會是正確的 (會有重複或是沒顯示)

    還有一個問題是它會出現 "並會將物件參考設定為物件的執行個體"

    也就是我沒Sleep,Listview會來不及抓?想請問我該怎麼改呢? 這樣的速度實在是太慢了

    附上程式碼 skydrive http://sdrv.ms/P0qqNs

    謝謝

    2012年8月14日 上午 10:20

解答

  • 您好,

    不知您問題是否解決了?

    或許能用 Parallel.ForEach 試看看! 

    以下我是先用 Parallel 後再把資料放到ListView之中,給您參考,希望對您有幫助,謝謝!

    private void Scan2()
    {
    	string[] ipall = ipDeal.IpAll(ip_from, ip_to);//get all ip
    	ConcurrentQueue<string> cq = new ConcurrentQueue<string>();
    	Parallel.ForEach(ipall, ipCurr =>
    	{
    		Ping ping = new Ping();
    		PingReply pingReply = ping.Send(ipCurr, timeout);//ping
    		string thishostName, thisroundtripTime; 
    		try
    		{
    			if (pingReply.Status == IPStatus.Success)
    			{
    				thisroundtripTime = pingReply.RoundtripTime.ToString();
    				thishostName = Dns.GetHostEntry(ipCurr).HostName;
    			}
    			else
    			{
    				thisroundtripTime = "N/S";
    				thishostName = "N/S";
    			}
    		}
    		catch (Exception ex)
    		{
    			thisroundtripTime = "N/S";
    			thishostName = "N/S";
    		}
    		cq.Enqueue(thisroundtripTime + "," + ipCurr + "," + thishostName + "," + pingReply.Status.ToString());
    
    	});
    
    	//add to listview
    	string ipInfo;
    	while (cq.TryDequeue(out ipInfo))
    	{
    		string[] inInfos = ipInfo.Split(',');
    		string ItemKey = inInfos[1];
    		listView1.Items.Add(ItemKey, ItemKey, 0);//add a Item,IP                            
    		listView1.Items[ItemKey].SubItems.Add(inInfos[0]);//RoundtripTime
    		listView1.Items[ItemKey].SubItems.Add(inInfos[2]);//HostName
    		listView1.Items[ItemKey].SubItems.Add(inInfos[3]);//Status
    	}
    }


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年8月17日 上午 02:13

所有回覆

  • 先把 do_work 中的 Application.DoEvents 拿掉

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年8月14日 下午 12:21
    版主
  • 先把 do_work 中的 Application.DoEvents 拿掉

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

     試過了,還是不對 ( 類似這樣1 1 2 2 2 3 3 3 4 )

     PS 不知道除了ping 之外有沒有更快的方法?

    2012年8月14日 下午 03:37
  • 分成多個執行緒去 Ping , 應該會快一點吧, 我猜啦.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年8月14日 下午 05:07
    版主
  • 分成多個執行緒去 Ping , 應該會快一點吧, 我猜啦.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    我對Ping那段加上System.Thread後,某幾個IP就會跳出"並會將物件參考設定為物件的執行個體",而某幾個會成功
    2012年8月15日 上午 02:32
  • 我嘗試過加了一行lock,結果無效,除了把Sleep的時間加長外,其他都會出資料重複的情形

    2012年8月15日 上午 10:12
  • 您好,

    您的問題應該是ping的時間花太久吧!

    如果將多個ping ip分成多個task去做呢?

    Task.Wait Method


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年8月15日 下午 12:06
  • 您好,

    您的問題應該是ping的時間花太久吧!

    如果將多個ping ip分成多個task去做呢?

    Task.Wait Method


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    可是ping本身的timeout我給的是1,這樣還不夠嗎??

    2012年8月15日 下午 06:03
  • 您好,

    不知您問題是否解決了?

    或許能用 Parallel.ForEach 試看看! 

    以下我是先用 Parallel 後再把資料放到ListView之中,給您參考,希望對您有幫助,謝謝!

    private void Scan2()
    {
    	string[] ipall = ipDeal.IpAll(ip_from, ip_to);//get all ip
    	ConcurrentQueue<string> cq = new ConcurrentQueue<string>();
    	Parallel.ForEach(ipall, ipCurr =>
    	{
    		Ping ping = new Ping();
    		PingReply pingReply = ping.Send(ipCurr, timeout);//ping
    		string thishostName, thisroundtripTime; 
    		try
    		{
    			if (pingReply.Status == IPStatus.Success)
    			{
    				thisroundtripTime = pingReply.RoundtripTime.ToString();
    				thishostName = Dns.GetHostEntry(ipCurr).HostName;
    			}
    			else
    			{
    				thisroundtripTime = "N/S";
    				thishostName = "N/S";
    			}
    		}
    		catch (Exception ex)
    		{
    			thisroundtripTime = "N/S";
    			thishostName = "N/S";
    		}
    		cq.Enqueue(thisroundtripTime + "," + ipCurr + "," + thishostName + "," + pingReply.Status.ToString());
    
    	});
    
    	//add to listview
    	string ipInfo;
    	while (cq.TryDequeue(out ipInfo))
    	{
    		string[] inInfos = ipInfo.Split(',');
    		string ItemKey = inInfos[1];
    		listView1.Items.Add(ItemKey, ItemKey, 0);//add a Item,IP                            
    		listView1.Items[ItemKey].SubItems.Add(inInfos[0]);//RoundtripTime
    		listView1.Items[ItemKey].SubItems.Add(inInfos[2]);//HostName
    		listView1.Items[ItemKey].SubItems.Add(inInfos[3]);//Status
    	}
    }


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年8月17日 上午 02:13
  • 謝謝,解決了

    用了ConcurrentQueue 後,listview出現的就正確了

    2012年8月17日 上午 05:34