我是一個編程新手,我試圖做我的第一件事,這將是爲別人而不僅僅是我(所以不應該是那種蹩腳的^^)C#方法中帶參數的線程使用相同的變量
這是局域網內客戶端的在線檢查器(所以他可以粘貼客戶端列表,並返回在線或離線狀態)。
fyi:我正在使用Try/Catch,因爲ping.send到脫機主機返回的錯誤導致應用程序崩潰。
目前,它看起來像這樣:
private void btn_check_Click(object sender, EventArgs e)
{
string[] hosts = txt_hosts.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (String host in hosts)
{
pinger(host);
}
}
public void pinger(string host)
{
var ping = new System.Net.NetworkInformation.Ping();
try
{
var result = ping.Send(host);
txt_result.Text += "true" + Environment.NewLine;
Application.DoEvents();
}
catch
{
txt_result.Text += "false"+Environment.NewLine;
Application.DoEvents();
}
}
現在,界面中,就像冰凍每當ping.send正在處理(這就是ping命令的超時的幽長的原因)。
有沒有辦法做到這一點?在我嘗試啓動一個線程之前,但這不起作用,因爲都寫入txt_result並返回一個錯誤。
感謝您的幫助!
,因爲你做的UI(我想你說的接口)被凍結什麼所謂的「阻塞操作」 - 你在GUI線程中運行代碼,並要運行它在正常線程上。您需要從工作線程調用ping。閱讀http://msdn.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem.aspx Synrhconize你的線程和寫入外部文件。 – ilansch
對於使用Application.DoEvents()的相同 –
不好的練習,您也可以使用BackgroundWorker。不惜一切代價避免它。此外你的catch塊是空的(即沒有捕獲正確或特定的異常來適當地處理錯誤)。爲什麼? –