Проблема параллельного цикла в C # - PullRequest
2 голосов
/ 19 мая 2011

Когда этот код запускается, покажите мне эту ошибку: ошибка «Ссылка на объект не установлена ​​для экземпляра объекта» возникает в первой строке => MinorDBDataContext mdc = new ...

, но также с серийным номером for для(int i; i <1005; i ++) {} "работает нормально. </p>

в чем проблема?

Thread.CurrentThread.Priority = ThreadPriority.Highest;
        var query = from M in new MajorDBDataContext().User_Accounts select M;
        List<User_Account> Ulist = query.ToList();
        string d = DateTime.Now.ToString();
        int c = 0;
        string temp ="";
        Parallel.For(0, 1005, (i,loop) =>
        {
                try
                {
                    MinorDBDataContext mdc = new MinorDBDataContext(_Filings.OnServerRepository(Ulist[i].user_Sys_DBPath));
                    GoodJob(mdc, temp, i);
                    DA.Page page = mdc.Pages.Single();
                    temp += mdc.Minor_Users.Take(1).SingleOrDefault().Minor_User_Email;
                    temp += mdc.Minor_Users.Take(1).SingleOrDefault().Minor_User_Name;
                    temp += mdc.Minor_Users.Take(1).SingleOrDefault().Minor_User_Family + i.ToString();
                }
                catch { }
        });
        append(temp);

1 Ответ

5 голосов
/ 19 мая 2011

Ваше исключение может свидетельствовать о других вещах.Какое значение на самом деле null?Вы не говорите.

Я вижу некоторые проблемы с этим кодом.

Вы не можете зависеть от последовательности цикла, но у вас есть temp += (последовательное добавление строки ксуществующей строки, затем присваивая строку обратно исходной переменной) во всем параллельном коде.Temp устанавливается вне параллельного цикла.Это очень опасно.Неправильное использование общего состояния / данных / ресурсов является одной из наиболее распространенных ошибок в многопоточном коде.

temp может иметь значения, добавленные не по порядку.Несколько вещей будут добавлены к temp одновременно, и, таким образом, temp может в конечном итоге пропустить информацию, потому что temp перезаписывается из нескольких потоков.

Откуда берется _Filings?Что это?

Возможно, вы захотите создать новый temp string внутри цикла и добавить туда все, добавив окончательный temp к ConcurrentBag (который вы создаете вне цикла)в каждой итерации.После этого вне параллельного цикла вы можете перебрать ConcurrentBag и получить окончательную строку в безопасной среде.

Обновление на основе комментария Комментарий:

System.Web.HttpContext.Current.Server.MapPath используется, а HttpContext.Current является нулевым в цикле многопоточности.

Причина в том, что вы сейчас находитесь в другом потокетекущий HttpContext, поэтому он не может ответить на любые вопросы для вас.Вам придется либо передать в контексте параллельную задачу, либо отдельные значения из нее.Я не знаю, насколько это опасно в параллельной среде.

HttpContext myContext = HttpContext.Current;

В вашем параллельном цикле используйте myContext вместо HttpContext.Current.

Я не рекомендую это какЗнание HttpContext в областях (таких как уровень данных) устанавливает ненужную связь и делает приложение очень сложным в обслуживании.Чтобы порекомендовать лучшее решение, потребуется гораздо больше разбирать ваше приложение, чем это возможно при публикации на форуме.Однако на данный момент это должно заставить вас двигаться снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...