C# 使用异步httpwebrequest锁定

C# 使用异步httpwebrequest锁定,c#,asynchronous,locking,C#,Asynchronous,Locking,我有一个对象,它从服务器下载一个文件,将其异步保存到独立的存储中,并提供一个GetData方法来检索数据。我会使用一个 IsolatedStorageFile storageObj; //initialized in the constructor lock(storageObj) { //save code } 在回应和 lock(storageObj) { //load code } 在GetData方法中 编辑:我将在这里给出一些上下文。 该应用程序(适用于Windows

我有一个对象,它从服务器下载一个文件,将其异步保存到独立的存储中,并提供一个GetData方法来检索数据。我会使用一个

IsolatedStorageFile storageObj; //initialized in the constructor

lock(storageObj)
{
   //save code
}
在回应和

lock(storageObj)
{
   //load code
}
在GetData方法中

编辑:我将在这里给出一些上下文。 该应用程序(适用于Windows Phone)需要从服务器下载和缓存多个文件,因此我创建了一个类型,该类型包含两个字符串(一个uri和一个文件名),从给定的uri发送数据并保存。同一对象还具有get data方法。下面是代码(简化了一点)


你的问题并没有提供太多的背景信息,而且根据所提供的大量信息,人们可能倾向于简单地告诉你是的,可能会有一些小的但相关的补充

实践通常会看到锁定发生在专用
对象的实例上,请确保不要锁定
,因为您锁定了当前对象的整个实例,这几乎不是您的意图-但是,在您的情况下,我们不完全知道,我几乎不认为锁定存储实例是可行的方法

另外,由于您提到了客户机和服务器交互,所以它并不是那么直截了当的

根据负载和许多其他因素,您可能希望从服务器提供文件的多次读取,但在下载的客户端上的任何一次仅进行一次写入;为此,我建议使用
ReaderWriterLockSlim
类,它公开
TryEnterReadLock
tryenterroitelock
和相应的释放方法

有关此类的更多详细信息,请参阅


另外,当在锁的范围内编码时,请记住使用
try
catch
finally
,始终在
finally
块中释放锁。

你的问题没有提供太多的上下文,而且根据所提供的大量信息,人们可能倾向于简单地告诉你是,可能有一些小的,但相关的补充

实践通常会看到锁定发生在专用
对象的实例上,请确保不要锁定
,因为您锁定了当前对象的整个实例,这几乎不是您的意图-但是,在您的情况下,我们不完全知道,我几乎不认为锁定存储实例是可行的方法

另外,由于您提到了客户机和服务器交互,所以它并不是那么直截了当的

根据负载和许多其他因素,您可能希望从服务器提供文件的多次读取,但在下载的客户端上的任何一次仅进行一次写入;为此,我建议使用
ReaderWriterLockSlim
类,它公开
TryEnterReadLock
tryenterroitelock
和相应的释放方法

有关此类的更多详细信息,请参阅


另外,在锁的范围内编码时,请记住使用
try
catch
finally
,始终在
finally
块中释放锁。

哪个类包含此代码?这很重要,因为如果它被创建了不止一次,这很重要。如果它在进程的生命周期中创建一次,则可以执行此操作,否则应锁定静态对象实例

我相信创建一个单独的对象只是为了锁定,这是一个很好的实践,但我已经忘记了为什么。例如:

IsolatedStorageFile storageObj; //initialized in the constructor
(static) storageObjLock = new object();
...
// in some method
lock(storageObjLock)
{
   //save code 
}

什么类包含此代码?这很重要,因为如果它被创建了不止一次,这很重要。如果它在进程的生命周期中创建一次,则可以执行此操作,否则应锁定静态对象实例

我相信创建一个单独的对象只是为了锁定,这是一个很好的实践,但我已经忘记了为什么。例如:

IsolatedStorageFile storageObj; //initialized in the constructor
(static) storageObjLock = new object();
...
// in some method
lock(storageObjLock)
{
   //save code 
}

如果是这样的话,为什么不同步呢?那会阻止ui线程如果是这样的话,为什么不同步呢?那会阻止ui线程谢谢你的建议,我会展开我的问题。哦,在我忘记之前,这个应用程序中没有写入服务器,请求的数据的参数严格地在uri中。很遗憾,ReaderWriterLockSlim不在Silverlight中。@Chris:在这种情况下,查看一下
监视器
-好的,那么Monitor.Enter(对象)和Monitor.TryEnter(对象)之间的区别是TryEnter不会阻塞吗?嗯,你的意思是如果我有几个线程试图同时读取文件,它们用lock(Object)语句互相阻塞。现在的问题是如何处理TryEnter()==错误的情况。嗯……谢谢你的建议,我将展开我的问题。哦,在我忘记之前,这个应用程序中没有向服务器写入数据,请求的数据的参数严格地在uri中。遗憾的是,ReaderWriterLockSlim不在Silverlight中。@Chris:在这种情况下,看看
Monitor
-好的,那么Monitor.Enter(Object)之间的区别是什么呢和Monitor.TryEnter(对象)是TryEnter不会阻塞吗?嗯,你的意思是如果我有几个线程试图同时读取文件,它们用lock(Object)语句互相阻塞。现在的问题是如何处理TryEnter()==错误的情况。隐马尔可夫模型。。。