从类库项目中的Thread访问web.config中的appSettings

时间:2013-08-20 14:51:48

标签: asp.net multithreading c#-4.0 thread-safety httpcontext

我可以从另一个引用的类库项目中的方法访问ASP.NET web.config文件中的appSettings部分,当它被称为新Thread时? 我正在通过属性

访问该设置
 private static string TempXmlFolder
 {
      get
      {
           return System.Web.HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["ReceiptTempPath"] ?? "~/Receipts/TempXML");
      }
 }

有一个扩展方法可以生成收据。

 internal static void GenerateReceipt(this IMatter matter)
 {
     try
     {
          string XmlFile = TempXmlFolder + "/Rec_" + matter.MatterID + ".xml";
          // ...
          // Generating receipt from the matter contents
          // ...
          // Saving generated receipt
     }
     catch (Exception ex)
     {
          ex.WriteLog();
     }
 }

我将收据生成称为类库中的新线程,如

 Thread printThread = new Thread(new ThreadStart(this.GenerateReceipt));
 // To avoid exception 'The calling thread must be STA, because many UI components require this' (Using WPF controls in receipt generation function)
 printThread.SetApartmentState(ApartmentState.STA);
 printThread.Start();
 // ...
 // Do another stuffs
 // ...
 // Wait to generate receipt to complete
 printThread.Join();

但是由于HttpContext.CurrentThread为空,我无法访问当前的Web服务器配置文件。

除了将当前HttpContext传递给Thread之外,您能建议吗?如果不是,我要注意保持线程安全的事情是什么?

编辑#1

目前我正在将HttpContext传递给

这样的线程
 System.Web.HttpContext currentContext = System.Web.HttpContext.Current;
 Thread printThread = new Thread(() => this.GenerateReceipt(currentContext));

并在函数中,

 internal static void GenerateReceipt(this IMatter matter, System.Web.HttpContext htCont)
 {
      string TempXmlFolder = htCont.Server.MapPath(ConfigurationManager.AppSettings["ReceiptTempPath"] ?? "~/Receipts/TempXML");
      //...

1 个答案:

答案 0 :(得分:1)

TempXmlFolder传递给线程。不要依赖HttpContext.Current。或者,将HttpContext.Current的值传递给线程并稍后计算TempXmlFolder的值。

您可以使用任何您想要的方式传递值。也许是用lambda捕获的字段或局部变量。