public async Task Ping(int lowLim, int uppLim) { string[] ipParts = GetCurrentIPAddress().Split('.'); for (int i = lowLim; i <= uppLim; i++) { IterEvent.Invoke(i); PingReply answer = await AsincPing( string.Format("{0}.{1}.{2}.{3}", ipParts[0], ipParts[1], ipParts[2], i.ToString())); string macAddress = await GetMACAddress(answer.Address); try { if (answer.Status == IPStatus.Success) { PingEvent.Invoke( answer.Address.ToString() + "|" + macAddress + "|" + answer.RoundtripTime + "|" + Dns.GetHostEntry(answer.Address.ToString()).HostName); } } catch { PingEvent.Invoke(answer.Address.ToString() + "|" + macAddress + "|" + answer.RoundtripTime + "|" + "....."); } } }
Ответ
Поверьте, вы не хотите запустить это в отдельных потоках. Если речь идёт о высокоуровневых вещах наподобие async/await, опускаться назад на уровень потоков — неправильно.
Что вы хотите, так это выполнить задания параллельно. А это делается просто.
public async Task Ping(int lowLim, int uppLim)
{
string[] ipParts = GetCurrentIPAddress().Split('.');
var tasks = new List
async Task PingOne(string ip, int i)
{
IterEvent.Invoke(i);
PingReply answer = await AsincPing(ip);
string macAddress = await GetMACAddress(answer.Address);
try
{
if (answer.Status == IPStatus.Success)
{
PingEvent.Invoke(answer.Address.ToString() +
"|" + macAddress + "|" + answer.RoundtripTime +
"|" + Dns.GetHostEntry(answer.Address.ToString()).HostName);
}
}
catch
{
PingEvent.Invoke(answer.Address.ToString() +
"|" + macAddress + "|" + answer.RoundtripTime + "|" + ".....");
}
}
Кстати, не уверен в правильности исходного кода: вы точно не хотите внести сетевые вызовы под try?
Комментариев нет:
Отправить комментарий