Ненавижу вопрос про круглые люки. Не понимал его никогда. Потому что я видел разные.
Теперь буду знать. Отвечать теперь буду по тому что так было в спецификации (требованиях).
2. привычка хех, забывыю периодечиски что входит, поэтому все равно ставлю )
3. да Вы правы, но и в заделе на будущее есть резон.
4. это по сути одно и то же, я просто показываю сразу, что можно так можно так, ничего не имею против LINQ )
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")
};
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();
}
}
}
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;
//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
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);
}
);
}
}
}
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);
Теперь буду знать. Отвечать теперь буду по тому что так было в спецификации (требованиях).
SQL Profiler, SQL Plan Analizer, ну и есть разные продукты от Red Gate
а вообще думаю пойду ) темы довольно интересные.
3. да Вы правы, но и в заделе на будущее есть резон.
4. это по сути одно и то же, я просто показываю сразу, что можно так можно так, ничего не имею против LINQ )
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:
Файл Utils.cs
Файл InnerDownloaderSync.cs
Файл InnerDownloaderRx.cs
Файл InnerDownloaderASyncStyleOne.cs
Файл InnerDownloaderASyncStyleTwo.cs
Файл InnerDownloaderASyncStyleThree.cs
Файл InnerDownloaderRxASync.cs
раньше асинхронный код делал через 2 простых класса и статический массив/список откуда брались задания и асинхронно выполнялись )
посмотримс новый блекджек )
поудобнее помоему и покрасивей.
А еще пробелы бывают разные.
сидишь и выверяешь символы.
так тоже можно )