C# 如何在不使用状态对象的情况下将对象从一个线程传递到另一个线程

C# 如何在不使用状态对象的情况下将对象从一个线程传递到另一个线程,c#,asp.net,multithreading,.net-4.0,log4net,C#,Asp.net,Multithreading,.net 4.0,Log4net,我有一个ASP.NET应用程序,它使用类库程序集中的组件进行web服务调用。该组件使用线程池或某种自制的线程解决方案来生成后台线程,在后台线程中进行同步web服务调用 日志组件在ASP.NET应用程序中使用,并由帮助器类使用,这些帮助器类是组件在执行服务调用时从后台线程生成的 在ASP.NET中,HttpModule创建日志上下文对象并将其存储在HttpContext.Current.Items集合中。当需要记录消息时,ASP.NET应用程序和帮助器类中使用的帮助器类从HttpContext.C

我有一个ASP.NET应用程序,它使用类库程序集中的组件进行web服务调用。该组件使用线程池或某种自制的线程解决方案来生成后台线程,在后台线程中进行同步web服务调用

日志组件在ASP.NET应用程序中使用,并由帮助器类使用,这些帮助器类是组件在执行服务调用时从后台线程生成的

在ASP.NET中,HttpModule创建日志上下文对象并将其存储在HttpContext.Current.Items集合中。当需要记录消息时,ASP.NET应用程序和帮助器类中使用的帮助器类从HttpContext.Current.Items中获取日志记录上下文对象,以便使用将日志记录的消息放入上下文的信息装饰日志记录的消息

直接从ASP.NET调用帮助器类时,HttpContext.Current可用

当从组件创建的后台线程调用helper类时,HttpContext.Current为null,因此在记录消息时没有可用的日志上下文;记录的消息是无用的

我无法控制创建服务调用线程的组件。如果我这样做了,我会安排将日志上下文对象复制并传递到子线程中

我的日志上下文对象不能是静态的,因为它会被并发ASP.NET请求线程覆盖,这是不好的

我的日志上下文对象(简单int/string属性)的成员可以标记为ThreadStatic,这会起作用,我不再需要使用HttpContext.Current.Items

我真正需要的是让.NET运行时复制对象(或者甚至传递引用;两者都可以),并让它自动提供给子线程

我想知道是否可以向web.config添加一个元素,并指定一个帮助器类来创建线程,就像您在%lt;system.net>

我还想知道是否可以用某种属性标记日志上下文对象,从而自动复制它

我查看了log4nets LogicalThreadContext,尝试了一下,但没有成功。我认为这是为了跨进程或appdomain边界传递日志上下文信息

log4net的LogicalThreadContext在幕后使用了什么机制?来自System.Runtime.Remoting的内容?现在不赞成了吗

我的环境是.NET4,所以通过对.NET4中线程的并行扩展或增强,现在这是可能的

有人知道这是否可能吗?我开始觉得不是

  • 更新*
我必须做到以下几点:

Task<IEnumerable<Account>> accountsTask = Task<IEnumerable<Account>>.Factory.StartNew
    (
        instrumentationContext =>
            {
                var parentContext = instrumentationContext as Site.Instrumentation.InstrumentationContext;
                if (Site.Instrumentation.InstrumentationContext.Current == null && parentContext != null)
                    Site.Instrumentation.InstrumentationContext.Current = parentContext;
                return GetAccounts();
            },
        Site.Instrumentation.InstrumentationContext.Current
    );
Task accountsTask=Task.Factory.StartNew
(
instrumentationContext=>
{
var parentContext=instrumentationContext作为Site.Instrumentation.instrumentationContext;
if(Site.Instrumentation.InstrumentationContext.Current==null&&parentContext!=null)
Site.Instrumentation.InstrumentationContext.Current=父上下文;
返回GetAccounts();
},
Site.Instrumentation.InstrumentationContext.Current
);
其中GetAccounts()方法调用另一个类,该类又依赖于Site.Instrumentation.InstrumentationContext.Current

问题是,我宁愿不必更改代码来显式传入并在子线程中设置此状态对象-我希望.NET Framework自动为我这样做,这样创建任务的代码(上面)就不会更明智,也不必更改


如果没有其他人提供替代方案,Jon会得到绿色勾号,因为我认为这是我唯一现实的选择,尽管是任务而不是线程。

如果我理解正确,您所需要做的就是将对象传递给线程签名,那么参数化线程启动有什么问题

static void Main(string[] args)
    {
        object j = new object();
       Thread t = new Thread(()=>childThread(j));
       t.Start();
    }

    private static void childThread(object someObject)
    {
        // do work
    }

发布一些代码,以了解您正在做什么和试图实现什么。一下子把你所有的问题都集中在一个人的脑海里并提出建议真的很难。