2010-05-18 143 views
2

这是一个非常基本的问题,我想它是,但我找不到任何明确的答案。是SynchronizationContext.Post()线程安全吗?SynchronizationContext.Post()线程安全吗?

我有一个成员变量,它包含主线程的上下文,而_context.Post()被从多个线程中调用。我想Post()可以在对象上同时调用。我是否应该像

lock (_contextLock) _context.Post(myDelegate, myEventArgs); 

或者那是不必要的?

编辑:“任何实例成员不能保证线程安全
MSDN指出,如果我把我的lock(),然后呢?

回答

3

严格执行MSDN文档,然后否,SynchronizationContext.Post方法不是线程安全的。因此,除非文档中有错误,否则您将需要同步对该方法的访问。我很难相信它本身不是线程安全的,但是在处理线程同步问题时,您不能依靠假设。直到微软纠正文档或真正使其线程安全之前,真的没有办法解决这个问题。

+0

看着反汇编的代码,这个方法只是调用ThreadPool.QueueUserWorkItem,根据msdn,IS线程安全。 – 2010-05-18 19:58:45

+1

@菲尔:这并不奇怪。不幸的是,微软已经有效地保留了在未来版本或者服务包中以一种可以使其当前的线程安全行为无效的方式来改变实现的权利。我的猜测是他们真的打算让这个类拥有线程安全的实例方法,并且他们只是搞砸了文档。但是,这又是一个假设。 – 2010-05-18 20:07:28

+0

考虑到它的用法,将它变成无法线程安全的将是愚蠢的! – RichardOD 2010-06-13 11:35:59

1

SynchronizationContext.Post是线程安全的。文件忽略了这个事实。

我基于微软的AsyncOperationAsyncOperationManager实现这个断言,假设SynchronizationContext.Post是线程安全的(包括任何派生实现)。