次の要件があります。
ダウンロードする必要がある URL の配列があります。
- 同時にダウンロードできるのは 3 つの URL のみです
- これら 3 つの URL の 1 つ (または複数) が完了した場合 - 配列から次の空き URL を取得する必要があります
- これら 3 つの URL の 1 つ (または複数) が X 時間内に完了しない場合 - この URL をキャンセルする必要があります
- URL の配列が終了した場合 - 現在のすべてのタスクが完了するまで待機し、1 つだけがメイン メソッドから移動します。
C# 5.0 でそれを行うには? 私は次のことをしようとします:
class Program
{
static Stopwatch sw = Stopwatch.StartNew();
static void Main(string[] args)
{
List<Task> tasks = new List<Task>();
string[] urls = new string[] { "http://site1.ru", "http://www.site2.com", "http://site3.com", "http://site4.ru" };
foreach (var url in urls)
{
var task = AsyncVersion(url);
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
}
static async Task AsyncVersion(string url)
{
var webRequest = WebRequest.Create(url);
Console.WriteLine(
"Перед вызовом webRequest.GetResponseAsync(). Thread Id: {0}, Url : {1}",
Thread.CurrentThread.ManagedThreadId, url);
var webResponse = await webRequest.GetResponseAsync();
Console.WriteLine("{0} : {1}, elapsed {2}ms. Thread Id: {3}", url,
webResponse.ContentLength, sw.ElapsedMilliseconds,
Thread.CurrentThread.ManagedThreadId);
}
}
私が理解していない部分:
- 各スレッドの具体的な制御方法(1つずつまたはすべてのタスクだけを待つのではなく、スレッドごとに)
- 各プロセスの実行時間...