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)));
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д