Advertisement
Guest User

Untitled

a guest
Mar 8th, 2012
430
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.45 KB | None | 0 0
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Text;
  8. using System.Threading;
  9.  
  10. namespace ConsoleApplication4
  11. {
  12.     static class Program
  13.     {
  14.         static readonly Uri[] Uris = Enumerable.Range(0, 250).Select(_ => new Uri("http://ya.ru/")).ToArray();
  15.         static readonly ConcurrentQueue<Uri> Queue = new ConcurrentQueue<Uri>();
  16.  
  17.         static void Main()
  18.         {
  19.             Exec("DoWorkThreads(1)", whenDone => DoWorkThreads(1, whenDone));
  20.             Exec("DoWorkThreads(5)", whenDone => DoWorkThreads(1, whenDone));
  21.             Exec("DoWorkThreads(10)", whenDone => DoWorkThreads(1, whenDone));
  22.  
  23.             Exec("DoWorkAsync", DoWorkAsync);
  24.         }
  25.  
  26.         static void Exec(string name, Action<Action> run)
  27.         {
  28.             var watch = Stopwatch.StartNew();
  29.  
  30.             var completed = new ManualResetEvent(false);
  31.             run(() => completed.Set());
  32.             completed.WaitOne();
  33.  
  34.             watch.Stop();
  35.  
  36.             Console.WriteLine("{0} took {1} ms", name, watch.ElapsedMilliseconds);
  37.         }
  38.  
  39.         static void DoWorkThreads(int threadsCount, Action whenDone)
  40.         {
  41.             foreach (var uri in Uris)
  42.             {
  43.                 Queue.Enqueue(uri);
  44.             }
  45.  
  46.             var threads = new Thread[threadsCount];
  47.  
  48.             for (var i = 0; i < threadsCount; i++)
  49.             {
  50.                 threads[i] = new Thread(ProcessingThread);
  51.                 threads[i].Start();
  52.             }
  53.  
  54.             foreach (var thread in threads)
  55.             {
  56.                 thread.Join();
  57.             }
  58.  
  59.             whenDone();
  60.         }
  61.  
  62.         static void ProcessingThread()
  63.         {
  64.             Uri uri;
  65.             while (Queue.TryDequeue(out uri))
  66.             {
  67.                 LoadUri(uri, Success, Failure);
  68.             }
  69.         }
  70.  
  71.         static void DoWorkAsync(Action whenDone)
  72.         {
  73.             var syncRoot = new object();
  74.             var counter = Uris.Length;
  75.             var completed = new ManualResetEvent(false);
  76.  
  77.             Action handler = () =>
  78.             {
  79.                 lock (syncRoot)
  80.                 {
  81.                     counter--;
  82.                     if (counter > 0)
  83.                     {
  84.                         return;
  85.                     }
  86.                 }
  87.  
  88.                 completed.Set();
  89.             };
  90.  
  91.             try
  92.             {
  93.                 foreach (var uri in Uris)
  94.                 {
  95.                     LoadUriAsync(uri, Success, Failure, handler);
  96.                 }
  97.  
  98.                 completed.WaitOne();
  99.                 whenDone();
  100.             }
  101.             catch (Exception)
  102.             {
  103.                 whenDone();
  104.             }
  105.         }
  106.  
  107.         static void LoadUri(Uri uri, Action<Uri, string> success, Action<Uri> failure)
  108.         {
  109.             var request = CreateRequest(uri);
  110.  
  111.             try
  112.             {
  113.                 using (var response = (HttpWebResponse)request.GetResponse())
  114.                 {
  115.                     response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
  116.  
  117.                     using (var stream = response.GetResponseStream())
  118.                     using (var reader = new StreamReader(stream, Encoding.GetEncoding(1251)))
  119.                     {
  120.                         var dataContent = reader.ReadToEnd();
  121.                         var headers = response.Headers.ToString();
  122.  
  123.                         success(uri, headers + dataContent);
  124.                     }
  125.                 }
  126.             }
  127.             catch (Exception)
  128.             {
  129.                 failure(uri);
  130.             }
  131.         }
  132.  
  133.         static void LoadUriAsync(Uri uri, Action<Uri, string> success, Action<Uri> failure, Action completed)
  134.         {
  135.             var request = CreateRequest(uri);
  136.             request.BeginGetResponse(asyncResult =>
  137.             {
  138.                 try
  139.                 {
  140.                     using (var response = (HttpWebResponse)request.EndGetResponse(asyncResult))
  141.                     {
  142.                         response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
  143.  
  144.                         using (var stream = response.GetResponseStream())
  145.                         using (var reader = new StreamReader(stream, Encoding.GetEncoding(1251)))
  146.                         {
  147.                             var dataContent = reader.ReadToEnd();
  148.                             var headers = response.Headers.ToString();
  149.  
  150.                             success(uri, headers + dataContent);
  151.                         }
  152.                     }
  153.                 }
  154.                 catch (Exception)
  155.                 {
  156.                     failure(uri);
  157.                 }
  158.                 finally
  159.                 {
  160.                     completed();
  161.                 }
  162.             }, null);
  163.         }
  164.  
  165.         static HttpWebRequest CreateRequest(Uri uri)
  166.         {
  167.             var request = (HttpWebRequest)WebRequest.Create(uri);
  168.             request.CookieContainer = new CookieContainer();
  169.             request.AllowAutoRedirect = false;
  170.             request.Timeout = 500;
  171.             request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19";
  172.             return request;
  173.         }
  174.  
  175.         static void Success(Uri uri, string content)
  176.         {
  177.         }
  178.  
  179.         static void Failure(Uri uri)
  180.         {
  181.         }
  182.     }
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement