Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net SynchronizationContext.Post()是否线程安全?_.net_Multithreading_Synchronization_Locking - Fatal编程技术网

.net SynchronizationContext.Post()是否线程安全?

.net SynchronizationContext.Post()是否线程安全?,.net,multithreading,synchronization,locking,.net,Multithreading,Synchronization,Locking,这是一个非常基本的问题,我想是的,但我找不到任何明确的答案。SynchronizationContext.Post线程安全吗 我有一个成员变量,它保存主线程的上下文,并且正在从多个线程调用_context.Post。我想可以在对象上同时调用Post。我应该做类似的事情吗 lock (_contextLock) _context.Post(myDelegate, myEventArgs); 还是没有必要 编辑: 声明不保证任何实例成员是线程安全的。那么,我应该保留我的锁吗?严格遵守MSDN文档,

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

我有一个成员变量,它保存主线程的上下文,并且正在从多个线程调用_context.Post。我想可以在对象上同时调用Post。我应该做类似的事情吗

lock (_contextLock) _context.Post(myDelegate, myEventArgs);
还是没有必要

编辑:
声明不保证任何实例成员是线程安全的。那么,我应该保留我的锁吗?

严格遵守MSDN文档,然后不,SynchronizationContext.Post方法不是线程安全的。因此,除非文档中有错误,否则您将需要同步对该方法的访问。我自己很难相信它不是线程安全的,但您不能指望假设,尤其是在处理线程同步问题时。在Microsoft更正文档或真正使其线程安全之前,真的没有办法解决这个问题。

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


我将此断言建立在Microsoft的AsyncOperation和AsyncOperationManager实现的基础上,它们假定SynchronizationContext.Post是线程安全的,包括任何派生的实现。

查看反汇编代码,此方法只调用ThreadPool.QueueUserWorkItem,根据msdn,是线程安全的。@Phil:这并不奇怪。不幸的是,微软实际上保留了更改实现的权利,这种更改将使其当前的线程安全行为在未来的版本或服务包中失效。我的猜测是,他们确实打算让这个类拥有线程安全的实例方法,他们只是把文档搞砸了。但是,同样,这只是一个假设。考虑到它的用法,他们将其更改为非线程安全是愚蠢的@理查多:我完全同意!他们真的需要修改文档。这也不是唯一需要修复的实例。