给出以下代码:
string injectedString = "Read string out of HttpContext"; Task.Factory.StartNew(() => { MyClass myClass = new MyClass(); myClass.Method(injectedString); }
这是将字符串传递到任务/线程中的最好方法吗?
我对这种方法的关注是:
>垃圾收集者知道字符串何时变成了
上下文并正确清理?
>有没有更好的方法来将依赖项注入到打破主线程中的对象的链接的任务中?
这是一个Asp.Net webservice,如果它是重要的,是一个火,忘记类型的线程,我不等待任何形式的回应.
我的字符串其实是要读出HttpContext,这是为什么我以这种方式注入它的一个原因(线程不能访问调用线程HtppContext)
解决方法
您的lambda将被提升为编译器生成的类. injectString变量将成为该类的一个字段.
因此,当生成的类超出范围(基本上在lambda的最后)时,它将被垃圾回收,GC决定执行集合.
为了回应您的意见:
没有重复.编译器转过来:
string injectedString = "Read string out of HttpContext"; Task.Factory.StartNew(() => { MyClass myClass = new MyClass(); myClass.Method(injectedString); }
进入:
CompilerGeneratedClass c1 = new CompilerGeneratedClass(); c1.injectedString = "Read string out of HttpContext"; // call delegate here.
还要记住:字符串被扣留在CLR中.即使代码重复了..字符串文字将被扣留在一个池中.您本质上只有一个本地WORD大小的引用重复,指向字符串(仅字符串字面量)