8

我需要一些帮助来理解 azure CloudBlobClient、CloudQueueClient 和 CloudBlob 类中的线程安全。

我正在开发一个工作角色,其中包括多个独立的作业处理器,其中每个作业处理器从特定队列读取并写入/更新到一些可能相同的 blob 容器。

我想确保这些工作处理者不会互相踩踏。

1> 在不使用任何类型的锁的情况下,如何确保这种情况?如果我将单独的 CloudBlobClient 和 CloudQueueClient 分配给我的每个作业处理器(它们都生活在同一个进程中),是否足以说它们彼此独立并且因为每个作业处理器都使用单独的客户端实例,所以它们不会运行互相喜欢吗?

2> 在同一个作业处理器中,如果我尝试在 CloudBlobClient 上使用 Parallel.ForEach 并行调用 GetBlobReference 或 UploadText,我是否需要合并某种同步或这些方法是线程安全的?Azure 文档说它们不是,但我在网上看到的大多数示例似乎都没有在这些方法上应用任何类型的同步机制。实现这一目标的最佳方法是什么?我的意思是使用一个 CloudBlobClient 并并行调用 GetBlobReference 或 UploadText 的最佳方式?

4

2 回答 2

3

我查看了CloudBlobClient MSDN 上的文档,它说的是:

此类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

由于这不是静态成员,因此不能保证它是线程安全的。如果您想确保不会被 MS 可能在存储客户端库中遗漏的任何线程问题所困扰,那么是的,您应该确保每个线程都有自己的客户端(也许创建一个ThreadStatic变量) .

话虽如此,我已经使用CloudBlobClient上传多个项目Parallel.ForEach而不会引起任何问题。

于 2011-05-16T23:57:27.957 回答
2

随机选择的函数的文档说“任何公共静态......这种类型的成员都是线程安全的。不保证任何实例成员都是线程安全的。”,但我认为这是样板文件,因为有人不能费心去想。我建议您使用Reflector检查这些类,但我希望它们会很好,因为您引用的所有类都只是属性的存储库,当您进行像 UploadText 这样的调用时,这些属性最终会被放入 HTTP REST 请求中。只要您不更改不同线程中一个对象的属性(而且我认为您不需要 - 为 Parrallel.ForEach 的每次迭代创建一个 CloudBlobReference),那么我认为您将是安全的。

于 2011-05-16T23:56:27.423 回答