MSpec:如何使静态变量线程安全?

2024-01-06

我正在将 MSpec 用于我的最新项目,总的来说我对它非常满意。但是,当我的测试并行运行时,我确实遇到了并发问题,我想知道是否有人遇到过这个问题,或者更好的是,有解决方案吗?

MSpec 严重依赖静态方法和变量来工作。

现在,当我在基类中定义由多个测试类使用的静态变量,并且并行运行测试时,它们共享相同的静态变量,从而相互干扰。

我使用 NCrunch 和 Resharper 作为我的测试运行程序,并且我在两者中都遇到了问题。

有人熟悉这个问题吗?


首先,我建议阅读MSDN 上的 Head 安全指南 http://msdn.microsoft.com/en-us/library/f857xew0%28v=vs.71%29.aspx。这将使您很好地了解如何以及为何在 C# 中使方法线程安全。

以下规则概述了实现线程的设计指南:

  • 避免提供改变静态状态的静态方法。在常见的服务器场景中,静态状态在请求之间共享,这意味着多个线程可以同时执行该代码。这带来了线程错误的可能性。考虑使用一种设计模式,将数据封装到不在请求之间共享的实例中。
  • ...添加锁来创建线程安全代码会降低性能,增加锁争用,并可能出现死锁错误
  • 请注意锁定部分中的方法调用。当类 A 中的静态方法调用类 B 中的静态方法时,可能会导致死锁,反之亦然。如果A和B都同步它们的静态方法,这将导致死锁。您可能只有在线程压力很大的情况下才会发现这种死锁。
  • 请注意 lock 语句(Visual Basic 中的 SyncLock)的问题。使用lock语句来解决所有线程问题是很诱人的。然而,System.Threading.Interlocked 类对于必须是原子的更新来说是优越的......

一般而言,我更喜欢使用的方法(如果可能)是创建一个方法(静态或其他)不可变的 http://en.wikipedia.org/wiki/Immutable_object。为此,所有变量都应该是本地变量(在堆栈上本地创建,或作为参数传递给方法)。通过确保仅使用局部变量或成员变量是不可变的,每个线程将在自己的隔间中操作,并且对变量的更改不会影响另一个线程。这是我在 .NET 模拟软件中广泛使用的一种方法,可以在 C# 中实现无锁,从而实现高性能多线程。

或者,如果变量必须是成员变量,并且对它们的可变访问可以由 lock 关键字保护。小心使用锁会导致上下文切换(减慢速度)并引入死锁情况的可能性。它也不能保证线程安全,因为锁的使用必须防止您试图阻止的特定情况。

为了进一步阅读,我建议查看这些描述 C# 中线程安全性和不变性的相关问题:

  • 设计线程安全类 https://stackoverflow.com/questions/3128717/designing-a-thread-safe-class
  • 实现线程安全 https://stackoverflow.com/questions/564319/achieving-thread-safety
  • 为什么不可变对象是线程安全的 https://stackoverflow.com/questions/3595114/why-are-immutable-objects-thread-safe

此致,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MSpec:如何使静态变量线程安全? 的相关文章

随机推荐

  • NodeJS解码URI组件无法正常工作

    当我尝试使用decodeURLCompnent在nodeJS中解码下面的字符串时 var decoded decodeURI Ulysses 20Guimar C3 A3es 20 20lado 20par console log deco
  • DataGridView 绑定问题:“索引 -1 没有值。”

    我有一个绑定到绑定源的 datagridview 和表单上的几个按钮 一个按钮将项目添加到绑定源 另一个按钮删除当前选定的项目 还有一个事件处理程序 用于侦听 CurrentChanged 事件并更新 删除 按钮的 启用 状态 一切都很顺利
  • AWSElasticBeanstalkFullAccess(提供完全访问...)等效项?

    我正在学习有关 AWS Beanstalk 的课程 该课程可能已经过时 在 IAM 管理控制台中添加了一个用户 并且直接附加的现有策略之一是AWSElasticBeanstalkFullAccess 我自己在过滤策略时找不到它 这是改名了吗
  • 使用协议“YourProtocol”作为类型必须写为“any YourProtocol”错误

    我在实施协议时遇到错误 我已在名为 的文件中声明了如下协议 TransactionListViewViewModelItem swift 以下是我在此文件中的内容 protocol TransactionListViewViewModelI
  • 如何向 PHP/SQL 搜索脚本添加拼写建议

    使用 php sql 在我的网站上创建搜索功能 非常简单 只需使用 LIKE 子句在数据库上使用 SELECT ALL 查询并在页面上回显结果即可 我的问题是 如果用户输入错误的搜索查询 如何添加拼写建议 除非搜索词与数据库内容完全匹配 否
  • 如何在 MAT Eclipse 中使用 OQL 进行嵌入式查询

    我可以使用如下查询获取所有 Thread 对象 SELECT OBJECTS dominators s FROM java lang Thread s 那么如果我想对返回的结果对象进行进一步的分析 我认为OQL应该如下所示 SELECT f
  • Xamarin.Forms ListView 大小到内容

    我有一个相当大的表单 主要适用于平板电脑 它有一个 GridView 嵌套两个 stacklayouts 和 listview 我很少有一个 ListView 包含一些单行项目 并且我需要它来调整内容的大小 这是我的源代码
  • 单击电子邮件中的 Outlook safelink 保护链接似乎会执行代码两次

    这与编码本身并没有真正的关系 我的项目是在 Laravel 7 1 中 但更多的是在 Outlook 的安全测量中 基本上我有一个功能 可以发送一封包含按钮的电子邮件 它是一个带有令牌的链接 以及我的 Laravel 项目中用于执行某些操作
  • Discord.py SSLCertVerificationError

    我一直在开发一个机器人 昨晚它根据需要运行得很好 但今天早上当我在终端中打开机器人时 出现以下错误 Traceback most recent call last File d Documents Bots DS BOT bot py li
  • 我可以从 Windows 窗体应用程序运行编码 UI 测试吗?

    我可以从 Windows 窗体应用程序运行编码 UI 测试吗 正在寻找样本 Thanks 当然可以 您可以使用 mstest exe 命令行应用程序来运行编码的 UI 测试 您只需要编写简单的算法 确保在启动 mstest 时传递正确的参数
  • Symfony2 反向代理 - 基于 cookie 或其他设置分离相同 URL 的缓存

    我使用默认的 Symfony2 反向代理 并且需要根据 cookie 设置单独缓存同一 URL 该网站通过缩小图像和删除 JavaScript 来提供 基本 网站视图 由于内容相同 我使用了相同的 URL 但缓存当然是一个问题 我需要能够单
  • ASP Classic SQL Server 以 XML 格式从数据库返回结果

    我试图从 ASP 中的查询返回结果 当我使用 Response write Recordset 0 之类的东西时它可以工作 但它不能以 xml 格式工作 这是我的代码 Dim conn Dim Recordset Dim xmlDoc Se
  • 带有固定种子的 scipy.sparse.linalg.eigsh

    我正在尝试使用scipy sparse linalg eigsh https docs scipy org doc scipy reference generated scipy sparse linalg eigsh html具有固定种子
  • 如何使用远程页面的构造函数在 Greasemonkey 用户脚本中创建对象?

    我的用户脚本将运行的页面有一个命名空间 该命名空间定义了一个构造函数 我想使用相同的构造函数创建一个对象 并在我的用户脚本中使用该对象的方法 到目前为止我还没有成功 这就是我正在尝试做的事情 该页面具有以下本机 JavaScript 块 v
  • LinkedIn 岗位检查员给出 500 次失败

    我经营一个博客网站 我正在尝试在 LinkedIn 上分享博客 当我在 LinkedIn 帖子检查器上检查帖子时 它给出 500 错误 我不确定可能出了什么问题 因为我已经包含了元标记 并且我能够在 Facebook 上发布相同的 URL
  • jQuery SlideToggle Google 地图问题

    我读过其他类似的线程 但没有任何问题 响应 这有助于使其足够简单以了解我需要做什么 我使用的是 jQuery 版本 1 7 这可能解释了为什么其他问题中发布的一些代码不相似 Google 地图加载在 SlideToggle 的 div 中
  • 这两个控制器定义有什么区别? [复制]

    这个问题在这里已经有答案了 当我运行代码时 选项A失败但不确定原因是什么 angular module app controller controllerA function scope http code angular module a
  • 使用 fscanf() 使用 feof()

    这是我的代码 include
  • 如何在窗口中捕获数据

    我的计算机上安装了桌面应用程序 当我启动程序时 会打开某种窗口 让我们说 像这样 只是例子 因此 我想用 C 编写一个应用程序来查找此窗口并从中捕获一些数据 我应该看什么工具 我想走一条阻力最小的路 我需要捕获图像 文本框中的文本 还需要通
  • MSpec:如何使静态变量线程安全?

    我正在将 MSpec 用于我的最新项目 总的来说我对它非常满意 但是 当我的测试并行运行时 我确实遇到了并发问题 我想知道是否有人遇到过这个问题 或者更好的是 有解决方案吗 MSpec 严重依赖静态方法和变量来工作 现在 当我在基类中定义由