Что не так в этом коде Parallel.For? - PullRequest
0 голосов
/ 09 апреля 2011

это код, который я хочу запустить.

Parallel.For(1, itemCount, 1, () =>
                    {
                     return new ThreadLocalStateCache()
                     {
                         //assigning values to local variables
                         Receipient = serMailObj.ReceipientList.Dequeue(), //get a single recepeint for the email
                         mail = serMailObj.Email, //Object of type MailMessage
                         client = client //object of type SmtpClient
                     };
                }
     , (i, loopState) =>
     {
         doWork(i, loopState.ThreadLocalState);

     });
                }
//class to store local vairables for each thread
public class ThreadLocalStateCache
    {
        public KeyValuePair<string, string> Receipient { get; set; }

        public MailMessage mail { get; set; }

        public SmtpClient client { get; set; }
    }

private static void doWork(int instance, ThreadLocalStateCache threadInstance)
        { 
           //send mail
        }

и он продолжает говорить

Аргументы типа для метода 'System.Threading.Tasks.Parallel.For (longlong, System.Func, System.Func, System.Action) 'не может быть выведено из использования.Попробуйте явно указать аргументы типа.

Я не смог найти в Интернете ни одного ресурса, который бы четко объяснял, как использовать parallel.for с локальными переменными потока.Я пытаюсь обработать длинный список получателей электронной почты и отправить им письма.Скажите, пожалуйста, как я могу использовать parallel.for.

РЕДАКТИРОВАТЬ 1: Я пытаюсь этот код после прочтения этой статьи http://www.lovethedot.net/2009/02/parallelfor-deeper-dive-parallel.html

1 Ответ

1 голос
/ 09 апреля 2011

Parallel.For перегрузки, которые принимают шаг в качестве третьего аргумента, были удалены из .NET 4; см. комментарии к http://blogs.msdn.com/b/pfxteam/archive/2009/05/26/9641563.aspx.

В связи с этим ваш вызов с 5 аргументами преобразуется в this overload :

For<TLocal>(Int32, Int32, Func<TLocal>, Func<Int32, ParallelLoopState, TLocal, TLocal>, Action<TLocal>)

И, очевидно, компилятор не может соответствовать типам аргументов.

Поскольку шаг в любом случае равен 1, просто удалите его.
Затем вам нужно будет исправить делегат тела, который должен иметь три параметра (поскольку локальная переменная потока теперь отделена от объекта состояния цикла), и добавить еще один делегат, который будет применен к локальным переменным потока для окончательного вычисления. В конце должно быть что-то вроде этого:

Parallel.For( 1, itemCount,
              () =>
              { return new ThreadLocalStateCache() 
                           { 
                               Receipient = serMailObj.ReceipientList.Dequeue(),
                               mail = serMailObj.Email,
                               client = client
                           }; 
              },
              (i, loopState, threadLocal ) => 
              { 
                  doWork(i, threadLocal);
                  return threadLocal;
              },
              (threadLocal) => {}
            );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...