Je les exigences suivantes:multithreading en C# 5.0
Il y a tableau de urls, qui doit être téléchargé.
- Seuls 3 urls peuvent être en cours de téléchargement en même temps
- Si un (ou plusieurs) de ces 3 urls sont terminés - besoin d'obtenir la prochaine URL sans tableau
- si un (ou plusieurs) de ces 3 urls ne sont pas terminés pendant X temps - besoin d'annuler cette url
- Si le tableau d'urls est terminé - nous attendons pour terminer toutes les tâches en cours et un seul va notre méthode principale.
Comment faire sur C# 5.0? J'essaie de faire ce qui suit:
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);
}
}
Quelles sont les parties que je ne comprends pas:
- Comment contrôler chaque béton de fil (sans attendre que l'un par l'une ou l'ensemble des tâches, mais chaque thread)
- Depuis combien de temps chaque processus exécutons ...