标签:multithreading networking ping c net
我正在使用下面的代码来启动异步ping负载.我还有一个PingCompletedEventHandler调用的函数,该函数将成功ping的地址添加到列表中,以供以后使用.
我想知道一旦所有ping线程都完成后如何调用函数?
public static void PingRange(IPRange range)
{
foreach (IPAddress ip in range.GetAllIP())
{
// Create Pinger
AutoResetEvent waiter = new AutoResetEvent(false);
Ping pingSender = new Ping();
pingSender.PingCompleted += new PingCompletedEventHandler(pingSender_PingCompleted);
// Create a 32 byte data buffer
string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
byte[] buffer = Encoding.ASCII.GetBytes(data);
// Wait 4 seconds for a reply
int timeout = 4000;
PingOptions options = new PingOptions(64, true);
pingSender.SendAsync(ip, timeout, buffer, options, waiter);
PingStartCount++;
}
}
解决方法:
如果您使用的是.NET 4.0,则这相当容易.您可以使用CountdownEvent类而不是PingStartCount计数器和侍者事件. CountdownEvent将执行两者的工作.
public static void PingRange(IPRange range)
{
var finished = new CountdownEvent(1);
foreach (IPAddress ip in range.GetAllIP())
{
finished.AddCount(); // Indicate that a new ping is pending
var pingSender = new Ping();
pingSender.PingCompleted +=
(sender, e) =>
{
finished.Signal(); // Indicate that this ping is complete
};
string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
byte[] buffer = Encoding.ASCII.GetBytes(data);
PingOptions options = new PingOptions(64, true);
pingSender.SendAsync(ip, 4000, buffer, options, waiter);
}
finished.Signal(); // Indicate that all pings have been submitted
finished.Wait(); // Wait for all pings to complete
}
标签:multithreading,networking,ping,c,net 来源: https://codeday.me/bug/20191102/1991235.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。