サーバーのコレクションの平均往復時間を計算しようとしています。スピードアップするために、pingを並行して実行したいと思います。と呼ばれる関数を書いてAverageRoundtripTime()
動作するようですが、マルチスレッドについてよく知らないので、私がやったことは大丈夫なのだろうかと思っています。私のコードを見て、大丈夫かどうか、または私が望むものを達成するためのより良い方法があるかどうかを教えてください:
public void Main()
{
// Collection of hosts.
List<String> hosts = new List<String>();
// Add 100 hosts to the collection.
for (Int32 i = 0; i < 100; ++i) hosts.Add("www.google.com");
// Display the average round-trip time for 100 hosts.
Console.WriteLine(AverageRoundtripTime(hosts));
}
public Double AverageRoundtripTime(IEnumerable<String> hosts)
{
// Collection of threads.
List<Thread> threads = new List<Thread>();
// Collection of ping replies.
List<PingReply> pingReplies = new List<PingReply>();
// Loop through all host names.
foreach (var host in hosts)
{
// Create a new thread.
Thread thread = new Thread(() =>
{
// Variable to hold the ping reply.
PingReply reply = null;
// Create a new Ping object and make sure that it's
// disposed after we're finished with it.
using (Ping ping = new Ping())
{
reply = ping.Send(host);
}
// Get exclusive lock on the pingReplies collection.
lock (pingReplies)
{
// Add the ping reply to the collection.
pingReplies.Add(reply);
}
});
// Add the newly created thread to the theads collection.
threads.Add(thread);
// Start the thread.
thread.Start();
}
// Wait for all threads to complete
foreach (Thread thread in threads)
{
thread.Join();
}
// Calculate and return the average round-trip time.
return pingReplies.Average(x => x.RoundtripTime);
}
アップデート:
私が尋ねた関連する質問をチェックしてください:
タスク並列ライブラリ コードが Windows フォーム アプリケーションでフリーズする - Windows コンソール アプリケーションとして正常に動作する