Pull to refresh
68
0
zabr @zabr

User

Send message
Ненавижу вопрос про круглые люки. Не понимал его никогда. Потому что я видел разные.
Теперь буду знать. Отвечать теперь буду по тому что так было в спецификации (требованиях).

бед трип имхо лучше словить от лсд чем от псилоцибов )))
ну и псилобицин посильнее раза в 3 в визуальной стороне
разница в том что при лсд ты как правило можешь задать стартовое настроение.
(SQL Management Studio / VS) < 2005
SQL Profiler, SQL Plan Analizer, ну и есть разные продукты от Red Gate
«академическое помещение в центре Москвы» — семеновская центр москвы ) новокосино центр вселенной )
а вообще думаю пойду ) темы довольно интересные.
2. привычка хех, забывыю периодечиски что входит, поэтому все равно ставлю )
3. да Вы правы, но и в заделе на будущее есть резон.
4. это по сути одно и то же, я просто показываю сразу, что можно так можно так, ничего не имею против LINQ )
1. CNTRL+F рулит :))

public class UrlExt
{
public int Index;
public string Url;

internal UrlExt(int index, string url)
{
Index = index;
Url = url;
}
}

хотя можно и сделать структурой.

2. Я имел ввиду PFX, просто теперь оно входит в Rx, в этом контексте… надо было указать мне )
3. Это задел на будущее для доп обработок, например ошибок или настройки реквеста.
4. визуальное не больше того.
5. да именно так.
6. я посмотрел можно ли это сделать, но выше заметил что нехояшо это.

З.Ы. Визуально мне очень понравился асинхронный вариант №1 у Вас он последний в топике.

Довольно интересно, даже немного загадочно, и местами оч удобно,
но для себя решил пока остаться на Rx (PFX).

Отсрелить ногу возможность есть в 2ух случаях.

1) в методах типа async нельзя передавать параметры аля ref/out, соответсвенно будут пихать что пихнется )
2) лучше не надо обьединять PFX и async, немножко может взорваться мозг.

Но в любом случае это легче чем использовать асинкстейт, асинкрезалт.

З.Ы.

Класс операций закачки я разделил для удобства по файлам, чтобы не запутаться.
Код может содержать пару одинаковых по сути методов для наглядности.
Архив исходников: — ifolder.ru/20635091

Код:

Файл Program.cs:

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace Downloader
{
  class Program
  {
    private static readonly List<Utils.UrlExt> Urls =
      new List<Utils.UrlExt>
        {
          new Utils.UrlExt(0, "http://ya.ru"),
          new Utils.UrlExt(1, "http://google.ru"),
          new Utils.UrlExt(2, "http://habrahabr.ru")
        };

    private static void Main()
    {
      Stopwatch sw = new Stopwatch();
      sw.Start();

      Console.WriteLine("Press any key to start .... ");
      Console.ReadKey();
      Console.WriteLine(Environment.NewLine);

      // ================== sync version ===================
      sw.Restart();
      Console.WriteLine("Starting Sync Version");
      Console.WriteLine();

      InnerDownloader.SyncDownload(Urls, sw);

      Console.WriteLine("End Sync Version");
      Console.WriteLine(Environment.NewLine);
      // ================ end sync version =================

      // ================== async rx version ===================
      sw.Restart();
      Console.WriteLine("Starting ASync RX (PFX) Version (.Net 3.5-4.0)");
      Console.WriteLine();

      InnerDownloader.RxASyncDownload(Urls, sw);

      Console.WriteLine("End ASync RX (PFX) Version (.Net 3.5-4.0)");
      Console.WriteLine(Environment.NewLine);
      // ================ end async rx version =================

      // ================== new async version ===================
      sw.Restart();
      Console.WriteLine("Starting New ASync Version (.Net 5.0)");
      Console.WriteLine();

      InnerDownloader.NewASyncDownload(Urls, sw);

      Console.WriteLine("End New ASync Version (.Net 5.0)");
      Console.WriteLine(Environment.NewLine);
      // ================ end old async version =================

      // ================== new async version v2 ===================
      sw.Restart();
      Console.WriteLine("Starting New ASync Version (.Net 5.0) v2");
      Console.WriteLine();

      InnerDownloader.NewASyncDownloadV2(Urls, sw);

      Console.WriteLine("End New ASync Version (.Net 5.0) v2");
      Console.WriteLine(Environment.NewLine);
      // ================ end old async version v2 =================

      // ================== new async version v3 ===================
      sw.Restart();
      Console.WriteLine("Starting New ASync Version (.Net 5.0) v3");
      Console.WriteLine();

      InnerDownloader.NewASyncDownloadV3(Urls, sw);

      Console.WriteLine("End New ASync Version (.Net 5.0) v3");
      Console.WriteLine(Environment.NewLine);
      // ================ end old async version v3 =================

      // ================== new async version v4 ===================
      sw.Restart();
      Console.WriteLine("Starting ASync RX (PFX) Version (.Net 3.5-4.0) + New ASync Version (.Net 5.0) v4");
      Console.WriteLine();

      InnerDownloader.NewASyncDownloadV4(Urls, sw);

      Console.WriteLine("End ASync RX (PFX) Version (.Net 3.5-4.0) + New ASync Version (.Net 5.0) v4");
      Console.WriteLine(Environment.NewLine);
      // ================ end old async version v4 =================

      Console.WriteLine("Press any key to exit .... ");
      Console.ReadKey();
    }
  }
}

* This source code was highlighted with Source Code Highlighter.


Файл Utils.cs
using System;
using System.IO;
using System.Net;

namespace Downloader
{
  public class Utils
  {
    public static int GetLenght(WebResponse response)
    {
      string result = "";
      var stream = response.GetResponseStream();

      if (stream != null)
      {
        using (var sr = new StreamReader(stream))
        {
          result = sr.ReadToEnd();
        }
      }

      return result.Length;
    }

    public class UrlExt
    {
      public int Index;
      public string Url;

      internal UrlExt(int index, string url)
      {
        Index = index;
        Url = url;
      }
    }

    public static int DrawTextProgressBar(int progress, int total, string data)
    {
      progress = progress + 1;

      //draw empty progress bar
      Console.CursorLeft = 0;
      Console.Write("["); //start
      Console.CursorLeft = 12;
      Console.Write("]"); //end
      Console.CursorLeft = 1;
      const float onechunk = 3.5F;

      //draw filled part
      int position = 1;
      for (int i = 0; i < onechunk * progress; i++)
      {
        Console.BackgroundColor = ConsoleColor.Gray;
        Console.CursorLeft = position++;
        Console.Write(" ");
      }

      //draw unfilled part
      for (int i = position; i <= 11; i++)
      {
        Console.BackgroundColor = ConsoleColor.Black;
        Console.CursorLeft = position++;
        Console.Write(" ");
      }

      //draw totals
      Console.CursorLeft = 14;
      Console.BackgroundColor = ConsoleColor.Black;
      Console.Write("{0} of {1}, {2} ", progress, total, data); //blanks at the end remove any excess

      Console.WriteLine(Environment.NewLine);

      return 0;
    }
  }
}


* This source code was highlighted with Source Code Highlighter.


Файл InnerDownloaderSync.cs

using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Threading;

namespace Downloader
{
  /// <summary>
  /// Синхронная версия
  /// </summary>
  public partial class InnerDownloader
  {
    public static void SyncDownload(List<Utils.UrlExt> urls, Stopwatch sw)
    {
      for (int index = 0; index < urls.Count; index++)
      {
        string result = DoSyncDownload(urls[index].Url, sw);
        Utils.DrawTextProgressBar(index, urls.Count, result);
      }
    }

    static string DoSyncDownload(string url, Stopwatch sw)
    {
      var req = (HttpWebRequest)WebRequest.Create(url);
      req.AllowAutoRedirect = true;

      var res = (HttpWebResponse)req.GetResponse();

      return string.Format("{0}: {1}, {2}ms, Thread:{3}", url, Utils.GetLenght(res),
                 sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId);

    }
  }
}


* This source code was highlighted with Source Code Highlighter.


Файл InnerDownloaderRx.cs

using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;

namespace Downloader
{
  /// <summary>
  /// Версия для работы через Reactive, PFX
  /// </summary>
  public partial class InnerDownloader
  {
    public static void RxASyncDownload(List<Utils.UrlExt> urls, Stopwatch sw)
    {
      Parallel.For(0, urls.Count,
             index =>
             {
               string result = DoSyncDownload(urls[index].Url, sw);
               Utils.DrawTextProgressBar(index, urls.Count, result);
             }
        );
    }
  }
}

* This source code was highlighted with Source Code Highlighter.


Файл InnerDownloaderASyncStyleOne.cs

using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;

namespace Downloader
{
  /// <summary>
  /// Асинхронная версия стиль № 1
  /// </summary>
  public partial class InnerDownloader
  {
    public static async void NewASyncDownload(IEnumerable<Utils.UrlExt> urls, Stopwatch sw)
    {
      int count = urls.Count();
      var tasks =
        (
          from url in urls
          let result = DoASyncDownloadV1(url.Url)
          select new
          {
            Response = result,
            Output = Utils.DrawTextProgressBar
            (
              url.Index, count,
              string.Format("{0}: {1}, {2}ms, Thread:{3}",
                url.Url, Utils.GetLenght(result.Result),
                sw.ElapsedMilliseconds, Thread.CurrentThread.ManagedThreadId)
            )
          }
        ).ToList();

      TaskEx.WhenAll(tasks.Select(t => t.Response));
    }

    static Task<WebResponse> DoASyncDownloadV1(string url)
    {
      var req = (HttpWebRequest)WebRequest.Create(url);
      req.AllowAutoRedirect = true;

      return req.GetResponseAsync();
    }
  }
}

* This source code was highlighted with Source Code Highlighter.


Файл InnerDownloaderASyncStyleTwo.cs

using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;

namespace Downloader
{
  /// <summary>
  /// Асинхронная версия стиль № 2
  /// </summary>
  public partial class InnerDownloader
  {
    public static void NewASyncDownloadV2(List<Utils.UrlExt> urls, Stopwatch sw)
    {
      var task = InnerNewASyncDownloadV2(urls, sw);
      task.Wait();
    }

    private static async Task InnerNewASyncDownloadV2(List<Utils.UrlExt> urls, Stopwatch sw)
    {
      int count = urls.Count();
      for (int index = 0; index < count; index++)
      {
        var result = await DoASyncDownloadV2(urls[index].Url);
        var data = string.Format("{0}: {1}, {2}ms, Thread:{3}",
                     urls[index].Url,
                     Utils.GetLenght(result),
                     sw.ElapsedMilliseconds,
                     Thread.CurrentThread.ManagedThreadId);

        Utils.DrawTextProgressBar(index, urls.Count, data);
      }
    }

    static Task<WebResponse> DoASyncDownloadV2(string url)
    {
      var req = (HttpWebRequest)WebRequest.Create(url);
      req.AllowAutoRedirect = true;

      return req.GetResponseAsync();
    }
  }
}

* This source code was highlighted with Source Code Highlighter.


Файл InnerDownloaderASyncStyleThree.cs

using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Threading;
using System.Threading.Tasks;

namespace Downloader
{
  /// <summary>
  /// Асинхронная версия стиль № 3
  /// </summary>
  public partial class InnerDownloader
  {
    public static void NewASyncDownloadV3(List<Utils.UrlExt> urls, Stopwatch sw)
    {
      for (int index = 0; index < urls.Count; index++)
      {
        string result = DoASyncDownloadV3(urls[index].Url, sw);
        Utils.DrawTextProgressBar(index, urls.Count, result);
      }
    }

    private static string DoASyncDownloadV3(string url, Stopwatch sw)
    {
      List<string> output = new List<string> { "" };
      var response = InnerNewASyncDownloadV3(url, sw, output);
      response.Wait();

      return output[0];
    }

    private static async Task InnerNewASyncDownloadV3(string url, Stopwatch sw, IList<string> output)
    {
      var result = await DoASyncDownloadV3(url);
      output[0] = string.Format("{0}: {1}, {2}ms, Thread:{3}",
                  url,
                  Utils.GetLenght(result),
                  sw.ElapsedMilliseconds,
                  Thread.CurrentThread.ManagedThreadId);
    }

    static Task<WebResponse> DoASyncDownloadV3(string url)
    {
      var req = (HttpWebRequest)WebRequest.Create(url);
      req.AllowAutoRedirect = true;

      return req.GetResponseAsync();
    }
  }
}


* This source code was highlighted with Source Code Highlighter.


Файл InnerDownloaderRxASync.cs

using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;

namespace Downloader
{
  /// <summary>
  /// Асинхронная версия 3 + PFX
  /// </summary>
  public partial class InnerDownloader
  {
    public static void NewASyncDownloadV4(List<Utils.UrlExt> urls, Stopwatch sw)
    {
      Parallel.For(0, urls.Count,
             index =>
             {
               string result = DoASyncDownloadV3(urls[index].Url, sw);
               Utils.DrawTextProgressBar(index, urls.Count, result);
             }
        );
    }
  }
}

* This source code was highlighted with Source Code Highlighter.
да, писал про «первый код». ради интереса превращу его в асинхронный )

раньше асинхронный код делал через 2 простых класса и статический массив/список откуда брались задания и асинхронно выполнялись )

посмотримс новый блекджек )
почему бы первый код не изменить на:

static void SyncVersion()
{
  Stopwatch sw = Stopwatch.StartNew();
  string[] urls = new string[]{"http://rsdn.ru", "http://gotdotnet.ru", "http://blogs.msdn.com"}
  foreach (string url in urls)
  {
    DoDownload(url, ref sw)
  }
}

void DoDownload(string url, ref Stopwatch sw)
{
  var req = WebRequest.Create(url1);
  var res = req.GetResponse();

  Console.WriteLine("{0} : {1}, elapsed {2}ms", url, req.ContentLength, sw.ElapsedMilliseconds);
}


* This source code was highlighted with Source Code Highlighter.


поудобнее помоему и покрасивей.
шедеврально )
встречался в коде 1 раз. в ХМЛ/Екселях раз 6. это жесть.
А еще пробелы бывают разные.

сидишь и выверяешь символы.
Пишите код так, будто человек, который будет его поддерживать – маньяк-психопат, который знает, где вы живете
Надеюсь ваш код мне не попадется )
select * from mytable (nolock)

так тоже можно )

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity