我需要一些帮助来理解azure CloudBlobClient,CloudQueueClient和CloudBlob类中的线程安全性。
我正在开发一个包含多个独立作业处理器的辅助角色,其中每个作业处理器从特定队列中读取并写入/更新到某些可能相同的blob容器。
我想确保这些工作处理器没有踩到彼此的脚趾。
1>如何在不使用任何锁的情况下确保是这种情况?如果我为每个作业处理器(都在同一个进程中)分配一个单独的CloudBlobClient和CloudQueueClient,是否足以说它们彼此独立,并且因为每个作业处理器都使用单独的客户端实例,它们将无法运行完全没有对方?
2 - ;在同一个作业处理器中,如果我尝试使用Parallel.ForEach在CloudBlobClient上并行调用并行调用GetBlobReference或UploadText,我是否需要合并某种同步或者这些方法是否安全? Azure文档说它们不是,但我在网上看到的大多数示例似乎都没有对这些方法应用任何类型的同步机制。实现这一目标的最佳方法是什么?我的意思是使用一个CloudBlobClient并在并行调用GetBlobReference或UploadText的最佳方式?
答案 0 :(得分:3)
我查看了CloudBlobClient
documentation on MSDN以及它所说的内容:
此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
由于这不是静态成员,因此不保证它是线程安全的。如果你想确定你不会被MS可能在存储客户端库中遗漏的任何线程问题所困扰,那么是的,你应该确保每个线程都拥有它自己的客户端(可能创建一个{{3变量)。
话虽如此,我已使用CloudBlobClient
在Parallel.ForEach
上传多个项目,但没有造成任何问题。
答案 1 :(得分:1)
randomly chosen function的文档说“任何公共静态...这种类型的成员都是线程安全的。任何实例成员都不能保证是线程安全的。”但我认为这是样板放入因为有人无法想到这件事。我建议你使用Reflector检查这些类,但是我希望它们没问题,因为你引用的所有类都只是属性的存储库,当你调用像UploadText这样的调用时最终被放入HTTP REST请求中。只要你不改变不同线程中一个对象的属性(我认为你不需要 - 为你的Parrallel.ForEach的每次迭代创建一个CloudBlobReference),那么我认为你会安全。