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和返回错误。
谢谢你的帮助!
如果使用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();
}