【问题标题】:System.Web.UI.Control.RenderControl fails when called from background threadSystem.Web.UI.Control.RenderControl 从后台线程调用时失败
【发布时间】:2013-01-08 13:10:46
【问题描述】:

我需要在后台线程中呈现控件并通过邮件发送输出。 所以我让这段代码在后台线程中运行:

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 请求线程运行时,相同的代码工作得非常好。 是否有可能让这个东西在后台线程本身工作?如果是怎么办?

谢谢, 普拉丹

【问题讨论】:

    标签: c# asp.net background-thread rendercontrol


    【解决方案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);
    }
    

    另外,我编写了一个名为 ucajax 的 OSS 项目来执行此操作,该库旨在与 Web 服务一起使用,但没有理由不能直接调用这些方法来呈现控件。

    【讨论】:

    • 行 HttpContext.Current.Server.Execute(pageHolder, stringwriter, false);抛出空引用异常,因为 HttpContext.Current 为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多