Question

I have a requirement to render a control in a background thread and send the output in mail. So I have this piece of code running in a background thread:

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)

The same code when run from asp.net request thread works perfectly fine. Is it possible to get this thing to work in background thread itself? If yes how?

Thanks, Pradhan

No correct solution

OTHER TIPS

Add a Form to your Page:

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);
}

Also, I wrote an OSS project to do this called ucajax, the lib was intended to be consumed with web services, but there is no reason you can't call the methods directly to render controls.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top