2014-04-16 15 views
1

我是一個編程新手,我試圖做我的第一件事,這將是爲別人而不僅僅是我(所以不應該是那種蹩腳的^^)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並返回一個錯誤。

感謝您的幫助!

+0

,因爲你做的UI(我想你說的接口)被凍結什麼所謂的「阻塞操作」 - 你在GUI線程中運行代碼,並要運行它在正常線程上。您需要從工作線程調用ping。閱讀http://msdn.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem.aspx Synrhconize你的線程和寫入外部文件。 – ilansch

+0

對於使用Application.DoEvents()的相同 –

+1

不好的練習,您也可以使用BackgroundWorker。不惜一切代價避免它。此外你的catch塊是空的(即沒有捕獲正確或特定的異常來適當地處理錯誤)。爲什麼? –

回答

1

如果使用acync/AWAIT:

// send request 
foreach (string host in hosts) 
    pinger(host); 

// async function 
async void pinger(string host) 
{ 
    var ping = new System.Net.NetworkInformation.Ping(); 
    bool bResp; 

    try 
    { 
     var result = await ping.SendPingAsync(host, 4000); 
     bResp = result.Status == System.Net.NetworkInformation.IPStatus.Success; 
    } 
    catch { bResp = false; } 

    txt_result.Text += bResp.ToString() + Environment.NewLine; 
} 
+0

嚇人真棒!!!! :) 謝謝 – Michael

0
System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    pinger(host); 
}); 

它可以在行中引發異常:txt_result.Text =「...」; 因爲您正嘗試從另一個線程修改線程中的值。 所以,你可以寫:

System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(new Action(() => 
{ 
    txt_result.Text = "..."; 
})); 

這將要求在UI線程修改數值。

0

在後臺工作者上運行。

public void pinger(string host) 
    { 
    var bw = new BackgroundWorker(); 

    bw.DoWork += delegate(object sender, DoWorkEventArgs e) 
    { 
     var ping = new System.Net.NetworkInformation.Ping(); 

    try 
    { 
     var result = ping.Send(host); 
     e.Result = new object[] { result}; 
    } 
    catch(Exception ex) 
    { 
     // Catch specific exceptions here as needed 
    } 
    }; 

    bw.RunWorkerCompleted += (bw_txt_results); 

    bw.RunWorkerAsync(); 

} 
private void bw_txt_results(object sender, RunWorkerCompletedEventArgs e) 
{ 
    txt_result = e.result[0].ToString(); 
} 
相關問題