Parallel.ForEach RenderControl из радиобуттонлиста не работает
У меня есть параллельный цикл генерации HTML с помощью оператора Parallel.ForEach. Где-то в выполнении я рендерил HTML-элементы управления с помощью функции RenderControl. Все элементы управления отображаются хорошо (текстовые поля, выпадающие списки, флажки и т. Д.), Но список радиобуттон дает следующую ошибку:
Это функция, которую я использую для отображения HTML
public static string ControlToString(Control control)
{
var sb = new StringBuilder();
var sw = new StringWriter(sb);
var hw = new Html32TextWriter(sw);
control.RenderControl(hw);
return sb.ToString();
}
Оператор RenderControl генерирует исключение нулевой ссылки:
Исключение типа "System.NullReferenceException" произошло в System.Web.dll, но не было обработано в коде пользователя. Дополнительная информация: ссылка на объект не установлена для экземпляра объекта.
Если я использую обычный цикл foreach, проблема не возникает. Вот код, который я использую для создания экземпляра списка radiobuttonlist:
var listControl new RadioButtonList();
listControl.ID = "FAC_" + searchFacet.Guid;
listControl.Items.Add(new ListItem("Select an item", "-1"));
Что я делаю неправильно? Почему радиопереключатель отличается от всех других элементов управления? Я проверял во время отладки. Никакие параметры не кажутся нулевыми.
Похоже, отсутствующий HttpContext был проблемой. Я "решил" это, добавив поддельный HttpContext:
public static string ControlToString(Control control)
{
if (HttpContext.Current == null)
{
HttpContext.Current = new HttpContext(new HttpRequest(string.Empty, "http://localhost:81/default.aspx", string.Empty), new HttpResponse(null));
}
var sb = new StringBuilder();
var sw = new StringWriter(sb);
var hw = new Html32TextWriter(sw);
control.RenderControl(hw);
return sb.ToString();
}
Это "хак", у кого-нибудь есть идея получше?