C#方法中使用相同变量的参数进行线程处理

本文关键字:参数 处理 线程 变量 方法 | 更新日期: 2023-09-27 17:58:31

我是一个编程新手,我正在努力为别人做我的第一件事,而不仅仅是我自己(所以不应该那么糟糕^^)

它是局域网中客户端的在线检查器(所以他可以粘贴客户端列表,然后返回在线或离线)。

fyi:我使用Try/Catch是因为对脱机主机的ping发送返回一个错误,导致应用程序崩溃。

目前看起来是这样的:

        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和返回错误。

谢谢你的帮助!

C#方法中使用相同变量的参数进行线程处理

如果使用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;
}
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
  pinger(host);
});

它可能在以下行引发异常:txt_result.Text="…";因为您正试图从另一个线程修改一个线程中的值。所以你可以写:

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

它将请求UI线程修改该值。

在后台工作程序上运行。

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