System.Web.UI.Control.RenderControl завершается ошибкой при вызове из фонового потока
У меня есть требование, чтобы сделать элемент управления в фоновом потоке и отправить вывод по почте. Итак, у меня есть этот кусок кода работает в фоновом потоке:
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(sendmail), new Object());
public void sendmail(object o)
{
UserControl cntrl = new Page().LoadControl("~/mycontrol.ascx") as UserControl;
StringWriter stringwriter = new StringWriter();
Html32TextWriter htmlwriter = new Html32TextWriter(stringwriter);
cntrl.RenderControl(htmlwriter);
SendEmailUsingNetMail(stringwriter);
}
At runtime I am getting this exception
System.NullReferenceException: Object reference NOT SET TO an instance of an object.
AT System.Web.UI.HtmlControls.HtmlForm.GetActionAttribute()
AT System.Web.UI.HtmlControls.HtmlForm.RenderAttributes(HtmlTextWriter writer)
AT System.Web.UI.HtmlControls.HtmlControl.RenderBeginTag(HtmlTextWriter writer)
AT System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer)
AT System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output)
AT System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
AT System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
AT System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer)
AT System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
AT System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
AT System.Web.UI.Control.Render(HtmlTextWriter writer)
AT System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
AT System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
AT System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
AT RedBus.RBMail.sendmail(object o)
Тот же код при запуске из потока запросов asp.net работает отлично. Возможно ли заставить эту вещь работать в фоновом потоке? Если да, то как?
Спасибо, прадхан
1 ответ
Добавьте форму на свою страницу:
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(sendmail), new Object());
public void sendmail(object o)
{
System.Web.UI.Page() pageHolder = new System.Web.UI.Page()
{AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath };
System.Web.UI.HtmlControls.HtmlForm form = new System.Web.UI.HtmlControls.HtmlForm();
UserControl cntrl = new Page().LoadControl("~/mycontrol.ascx") as UserControl;
form.Controls.Add(cntrl );
pageHolder.Controls.Add(form);
StringWriter stringwriter = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, stringwriter, false);
SendEmailUsingNetMail(stringwriter);
}
Кроме того, я написал проект OSS для этого под названием ucajax, библиотека предназначалась для использования с веб-службами, но нет никаких причин, по которым вы не можете вызывать методы напрямую для визуализации элементов управления.