Mam ten kod, który działa dobrze w pojedynczej wątku

foreach (var meetingRoom in meetingRooms)
{
            try
            {
                var res = calendarService.GetEvents(meetingRoom.Email, startUtc, endUtc, lightweight, limit);
                result.AddRange(res);
            }
            catch (Exception ex)
            {
                Log.Error(ex);
            }
}

Ale problemem jest wyświetlana lista konferencyjna zawiera ponad 40 000 wpisów. Próbuję zbliżyć się do równoległej.Forach - to właśnie mam do tej pory:

Parallel.ForEach(meetingRooms, () => 0,(meetingRoom) =>
        {
            var res = calendarService.GetEvents(meetingRoom.Email, startUtc, endUtc, lightweight, limit);

        }
        ,
        finalResult =>
        {
            lock (result)
            {
                result.Add(finalResult);
            }
        });

Nie mam szczęścia w zrozumieniu, jak działa czwarty parametr Lokalistycznie.

Należy pamiętać, że wynik i sale konferencyjne są listami z różnymi typami danych.

EDYTOWAĆ:

Wdrożyłem rozwiązanie Plinq jako jedną z odpowiedzi wskazuje. Wydaje się, że jego praca, ale biblioteka Exchange Web Services (EWS) nie jest zaimplementowana do nawiązywania równoległego jednej z jego metody. Uzyskanie i błąd "Nie unikalny klucz!" który jest rzucony przez kod Microsoft.

2
pandemic 17 luty 2017, 11:32

2 odpowiedzi

Najlepsza odpowiedź

Możesz użyć PLinq.

result = meetingRooms
  .AsParallel()
  .Select(meetingRoom => calendarService.GetEvents(meetingRoom.Email, startUtc, endUtc, lightweight, limit) )
  .ToList();

Gdy nadal chcesz używać równoległe.Forach (), przeciążenia z lokalem nie są tak przydatne. Użyj podstaw:

Parallel.ForEach(meetingRooms, meetingRoom =>
    {
        var res = calendarService.GetEvents(meetingRoom.Email, ...);

        lock (result) // only OK when you don't lock on it anywhere else
        {
            result.Add(res);
        }
    });
4
Henk Holterman 17 luty 2017, 08:50

Możesz także użyć a Concurrentbag ( lub Concurrentqueue lub ConcurrentNictionary), aby przechowywać wyniki i uniknąć blokady.

0
bcl 17 luty 2017, 08:54