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
C# 在同步块内外使用字段安全吗?_C#_.net_Multithreading_Resharper - Fatal编程技术网

C# 在同步块内外使用字段安全吗?

C# 在同步块内外使用字段安全吗?,c#,.net,multithreading,resharper,C#,.net,Multithreading,Resharper,背景 我们的应用程序发送的电子邮件在数据库表中排队。我们已经发送了一些重复电子邮件的实例,所以我正在实现一个锁,以防止多个线程同时发送电子邮件 ReSharper警告我: 该字段有时用于同步块内部,有时用于 不同步使用 问题 为什么ReSharper会告诉我这些,为什么我会担心呢 代码 这是我的(节略)代码: ReSharper无法判断(或保证)仅从同步块内调用SendQueuedMessage()。因此,就它而言,其他代码可能在不同步的情况下调用SendQueuedMessage(),并且\u

背景

我们的应用程序发送的电子邮件在数据库表中排队。我们已经发送了一些重复电子邮件的实例,所以我正在实现一个锁,以防止多个线程同时发送电子邮件

ReSharper警告我:

该字段有时用于同步块内部,有时用于 不同步使用

问题

为什么ReSharper会告诉我这些,为什么我会担心呢

代码

这是我的(节略)代码:

ReSharper无法判断(或保证)仅从同步块内调用
SendQueuedMessage()
。因此,就它而言,其他代码可能在不同步的情况下调用
SendQueuedMessage()
,并且
\u mailQueueRepository
正在
SendQueuedMessage()
中使用

如果您确定没有其他代码(在包含类的内部或外部)调用此方法,或者您已经确保从类内到
SendQueuedMessage()
的所有调用也使用相同的锁对象同步,那么您就可以了。如果您的类之外没有其他代码实际需要此方法,我建议您将其设置为私有。

问题场景:

我们已经发送了一些重复电子邮件的实例,所以我正在实现一个锁,以防止多个线程同时发送电子邮件

因此,您正在使用
Lock()
来防止这种情况发生,这意味着您需要同步访问公共资源的线程,在这种情况下,
\u mailQueueRepository

但同样在同一代码中,您使用的
\u mailQueueRepository
没有

 // I get the ReSharper warning here on _mailQueueRepository
    var messageAttachments = _mailQueueRepository.GetMessageAttachments(message.Id); // <== Accessed without a lock
//我在\u mailQueueRepository上得到了ReSharper警告

var messageAttachments=_mailQueueRepository.GetMessageAttachments(message.Id);//实际上,我试图阻止并发访问的是读取队列和发送电子邮件的方法,而不是存储库本身。我希望线程能够在一个线程读取并发送电子邮件时写入存储库。但我猜ReSharper不知道,所以它警告我。我知道我实际上可以不同步地访问该资源,所以我想我可以安全地忽略警告?@OutstandingBill-来自resharper:“警告除了编译器错误和警告之外,resharper还显示自己的警告,这些警告不会阻止您的代码编译,但可能会导致严重的编码效率低下。”. Resharper很聪明,可以说出矛盾的用法,但你知道实际用法是什么。如果确认使用管理良好的资源,则可以忽略警告:)@OutstandingBill此外,您可能有兴趣重新构造该方法以获取从字段提取的参数,与其在mix-context中使用它,
您可能感兴趣的是重新构造方法,以获取从字段中提取的参数,这到底意味着什么?
 // I get the ReSharper warning here on _mailQueueRepository
    var messageAttachments = _mailQueueRepository.GetMessageAttachments(message.Id); // <== Accessed without a lock