Исходя из того, что вы сказали, что сделали, очень мало замедления.
Возьмите этот базовый случай:
var source = Enumerable.Range(0, 1000000).Select(x => x.ToString()).ToArray();
var sw = Stopwatch.StartNew();
var results = source.Select(x => MD5Hash(x)).ToArray();
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds);
Этот код завершается за 5316.8091
миллисекунд.Это 188 хешей в миллисекунду.
Если я поместил свой тест в метод async
и запустил это:
var results = await Task.Run(() => source.Select(x => MD5Hash(x)).ToArray());
... тогда это займет 5531.4172
миллисекунд или около 181 хешаза миллисекунду.
И без async
я запускаю это:
var results = Task.Run(() => source.Select(x => MD5Hash(x)).ToArray()).Result;
И оно завершается за 5441.0798
миллисекунд или около 184 хешей за миллисекунду.
Таким образом, я могу только заключить, что код, который вы представили, не вызывает замедления.
Теперь, если вы хотите попробовать и заставить это работать быстрее, попробуйте использоватьРеактивная платформа Microsoft.Затем вы можете написать это:
var sw = Stopwatch.StartNew();
var query =
from n in Observable.Range(0, 1000000)
from h in Observable.Start(() => MD5Hash(n.ToString()))
select new { n, h };
query
.ToArray()
.Subscribe(xs =>
{
var results = xs.OrderBy(x => x.n).Select(x => x.h).ToArray();
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds);
});
, который работает в нескольких фоновых потоках, но может вернуться обратно в пользовательский интерфейс и выполняется менее чем за 5 секунд.
Просто NuGet "System.Reactive"и добавьте using System.Reactive.Linq
к вашему коду.