Przekształcenie pętli foreach w Parallel.ForEach

Przekształcenie pętli foreach w Parallel.ForEach
M6
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 6 lat
  • Postów:200
0

Dzień dobry,

mam poniższy kod, który dla listy orders realizuje sekwencyjnie wysyłkę wiadomości. Każda pętla korzysta ze zmiennej smtpServer, bez modyfikowania jej.

Jest sens zmieniać kod na Parallel.ForEach? Nie wiem za bardzo jak sprawić, żeby korzystanie ze zmiennej smtpServer przez każdy wątek było prawidłowe.

Kopiuj
            var smtpServer = await new GetSmtpServerByNameService().Execute("sprzedaz@name.pl");

            foreach (var order in orders)
            {
                var encryptedOrderId = new EncyptOrderIdService().Execute(order.OrderId);

                var link = $"/link/order?orderId={encryptedOrderId}";

                var msgToClient = GetMsgToClient(smtpServer.UserName, "test@name.pl", link);
            };
E9
  • Rejestracja:ponad 13 lat
  • Ostatnio:12 miesięcy
  • Postów:395
0

Za mało kodu pokazałeś. Co to jest smtpServer ? SmtpClient ? GDzie tutaj wywolujesz w ogóle metode .Send() ?
Czy te dwie linie

var encryptedOrderId = new EncyptOrderIdService().Execute(order.OrderId);
var msgToClient = GetMsgToClient(smtpServer.UserName, "test@name.pl", link);

Sa thread safe ?

edytowany 3x, ostatnio: error91
M6
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 6 lat
  • Postów:200
0

Przepraszam, nie zauważyłem, ze mi jedna linijka uciekła, całość:

Kopiuj
var smtpServer = await new GetSmtpServerByNameService().Execute("sprzedaz@name.pl");

            foreach (var order in orders)
            {
                var encryptedOrderId = new EncyptOrderIdService().Execute(order.OrderId);

                var link = $"/link/order?orderId={encryptedOrderId}";

                var msgToClient = GetMsgToClient(smtpServer.UserName, "test@name.pl", link);

                new SendMailService().Execute(smtpServer, msgToClient);
            };

smtpServer udostępnia informacje np. o nr portu, nazwa hosta itp. na potrzeby wysyłki wiadomości nic więcej.

GetMsgToClient jeżeli użyję ParallelForEach to nie będzie thread safe, bo właśnie będzie korzystała z lokalnej zmiennej smtpServer.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.