Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Как запустить каждую итерацию данного метода в отдельном потоке?

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(); for (int i = lowLim; i <= uppLim; i++) { string ip = string.Format("{0}.{1}.{2}.{3}", ipParts[0], ipParts[1], ipParts[2], i.ToString()); tasks.Add(PingOne(ip, i)); } await Task.WhenAll(tasks); }
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?

Комментариев нет:

Отправить комментарий