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)));