Parallel.ForEach что не верно? Не компилируется - C#

Узнай цену своей работы

Формулировка задачи:

    class Program
    {
        static void Main(string[] args)
        {
            ParallelOptions parOpt = new ParallelOptions();
            SynchronizationContext context = SynchronizationContext.Current;
 
            var localInit = new Func<WebClient>(
                () =>
                {
                    var webClient = new WebClient();
                    webClient.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
                    return webClient;
                });
 
            var body = new Func<UserViewModel, ParallelLoopState, WebClient, ParWebLinkSet>(
                (user, pLoopState, webClient) =>
                {
                    var set = new ParWebLinkSet();
                    set.Bytes = webClient.DownloadData(new Uri(user.PhotoLink));
                    set.User = user;
                    return set;
                });
 
            var localFinally = new Action<ParWebLinkSet>(
                (set) => context.Post(
                    (state) =>
                    {
                        var res = (ParWebLinkSet)state;
                        res.User.Photo = GetBitmapImageFromBytes(res.Bytes);
                    }, set));
 
            ParallelLoopResult loopRes = Parallel.ForEach(Users, parOpt, localInit, body, localFinally);

            Console.ReadKey();
        }
    }
В общем, хочу в нескольких потоках подкачивать изображения в список. Но что-то не пойму, как создать для каждого потока свой WebClient и уже в каждом потоке используя свой WebClient загрузить изображения.
В общем, проблему решил немного по другому. И получил просто огромное ускорение загрузки изображений. Медленно:
private void SomeMethod()
{
    SynchronizationContext context = SynchronizationContext.Current;
    var client = new WebClient();
    client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
    Task.Factory.StartNew(() =>
    {
        foreach (UserViewModel user in Users)
        {
            byte[] bytesBmp = client.DownloadData(new Uri(user.PhotoLink));
            context.Send((state) =>
            {
                var res = (Tuple<UserViewModel, byte[]>)state;
                res.Item1.Photo = GetBitmapImageFromBytes(res.Item2);
            }, new Tuple<UserViewModel, byte[]>(user, bytesBmp));
        }
    }).ContinueWith((task) => client.Dispose());
}
Очень быстро:
private void SomeMethod()
{
    SynchronizationContext context = SynchronizationContext.Current;
 
    int counter = 0;
    Parallel.ForEach(Users,
        (user, pLoopState) =>
        {
            var webClient = new WebClient();
            webClient.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
 
            byte[] bytesBmp = webClient.DownloadData(new Uri(user.PhotoLink));
            context.Post((state) =>
            {
                var res = (Tuple<UserViewModel, byte[]>)state;
                res.Item1.Photo = GetBitmapImageFromBytes(res.Item2);
            }, new Tuple<UserViewModel, byte[]>(user, bytesBmp));
            Debug.WriteLine("{0}) {1}", Interlocked.Increment(ref counter), user.FullName);
        });
}

Решение задачи: «Parallel.ForEach что не верно? Не компилируется»

textual
Листинг программы
Parallel.ForEach(users, u => Dispatcher.Invoke(()=>picturebox1.Image = GetPicture(u)));

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы