2013-01-08 19 views
1

我有一個要求在後臺線程中呈現控件並在郵件中發送輸出。 所以我有這段代碼在後臺線程中運行: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請求的線程中運行時相同的代碼工作完全正常。 是否有可能讓這個東西在後臺線程本身工作?如果是的話如何?

感謝, 普拉丹

回答

0

添加表單到您的網頁:

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,的lib是爲了與Web服務消費,但沒有理由不能直接調用方法來呈現控件。

+0

我不使用會話。 – pradhanbv

+0

忽略會話請參閱更新 –

+0

行HttpContext.Current.Server.Execute(pageHolder,stringwriter,false);由於HttpContext.Current爲空,所以會引發空引用異常。 – pradhanbv

相關問題