假设我有这段代码
ThreadPool.QueueUserWorkItem(unused =>
{
SynchronizationContext.SetSynchronizationContext(
new MyCustomSynchronizationContext());
// not reset back to null
}, null);
当前同步上下文被泄漏回线程池。如果有人再次调用ThreadPool.QueueUserWorkItem并且使用相同的线程来处理其他工作项,那么该线程的当前同步上下文是否会重置为null或者它是否会保留MyCustomSynchronizationContext?
相同的答案是否适用于在线程池上执行任务的任何其他方式,例如Task.Run,BeginInvoke等?
我知道一般来说TLS没有重置但是.NET源代码显示当前同步上下文的存储没有非常明确地定义(大多数时候它来自executioncontext但它似乎是特殊的WinRT由于某种原因)。
答案 0 :(得分:2)
答案在技术上未定义/未记录。你不应该在线程池线程上放置SynchronizationContext
而不清理它。
那就是说,我强烈怀疑SynchronizationContext
没有被清除。对于在线程池上执行任务的任何代码都是如此。