簡體   English   中英

C#5.0中的多線程

[英]multithreading in C# 5.0

我有以下要求:

有一些網址,應該下載。

  1. 只有3個網址可以同時下載
  2. 如果這3個網址中的一個(或更多)完成 - 需要從數組中獲取下一個免費網址
  3. 如果這三個網址中的一個(或多個)在X時間內未完成 - 需要取消此網址
  4. 如果url數組已經完成 - 我們等待完成所有當前任務,並且只有一個來自main方法。

如何在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. 如何控制每個線程具體(不要只等待一個一個或所有任務,但每個線程)
  2. 每個進程執行多長時間......

這看起來像Parallel.ForEach()的理想工作

您可以通過參數設置並發限制,然后在等待響應太長時間后使用WebRequest.Timeout屬性進行保釋。

像這樣的東西:

Parallel.ForEach(
    urls,
    new ParallelOptions { MaxDegreeOfParallelism = 3 },
    url =>
    {
        try
        {
            var request = WebRequest.Create( url );
            request.Timeout = 10000; // milliseconds
            var response = request.GetResponse();
            // handle response
        }
        catch ( WebException x )
        {
            // timeout or some other problem with the request
        }
        catch ( Exception x )
        {
            // make sure this Action doesn't ever let an exception
            // escape as that would stop the whole ForEach loop
        }
    }
);

Parallel.ForEach()的調用將阻塞調用線程,直到所有URL都被處理完畢。
但是,它將使用MaxDegreeOfParallelism線程來運行工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM