nUnit Assert.That委托并发问题

2024-05-04

我的代码中遇到了一些暂时的死锁,无法解决它。

简单的代码(我无法创建一个简单的调用链来重现代码InvokeChangeEvent)

[Test]
public async void Test()
{
    sut.InvokeChangeEvent("./foo.file");
    // Event is handled by an async handler chaining multiple await resulting in a file write

    // await Task.Delay(3000);

    Assert.That(() => Directory.GetFiles("some dir").Count(), Is.EqualTo(3).After(15000, 300));

}

我知道你们(:D)想要可执行代码,但我无法将其分割,因此我希望通过解释获得一些见解。

会发生什么:sut.InvokeChangeEvent调用一个事件处理程序,该事件处理程序稍后调用async事件处理程序然后调用一些async。链的末端导致Task.Run归结起来就是写3个文件。

上面的断言是作为委托实现的After返回一个DelayedConstraint并且有一个非常大的最大时间(15秒)和一个小的轮询间隔。

现在,当我调试代码时,InvokeChangeEvent 调用完全执行到最后一个 Task.Run,​​但是当 Task.Run 返回时,执行将返回到主线程,并且执行断言,进入“等待轮询”。

然而断言永远不会成功。当我调试问题时,总是处理 Task.Run 的返回after断言委托已运行(并且失败)。

我发现,当我放置一个await Task.Delay(3000);在断言之前,那么代码就可以正确执行。

如前所述,正在测试的系统有大量的等待和任务。运行链接,我无法使用一些简单的可运行代码重现该问题。

我已经搜索了一段时间,我无法弄清楚为什么 Task.Run (在不同的线程上执行)会产生(临时)死锁,即使DelayedConstraint有一个明确的轮询间隔以允许主线程继续进行。

它看起来像DelayedConstraint通过某种方式锁定主线程Thread.Sleep. await Task.Delay不,我知道这一点。让我困惑的是我已经检查过我总是做await(永不Task.Result等),因此期望在执行断言之前已写入该文件。

(Note: Thread.Sleep代替await Task.Delay不起作用。)

通常是DelayedConstraint用于确保文件系统已正确写入所有文件,因为我经历过文件系统处理文件的一些延迟。

我有一些感觉async void事件处理程序可能会造成我不理解的情况。

如果我设法创建一个简单的示例,我将更新该线程。


类比VS2012单元测试,尝试async Task签名而不是async void对于你的测试方法。这样,NUnit 应该能够跟踪待处理任务状态并通过以下方式检查异常:Task.Exception.

The async void根据定义,方法是一个一劳永逸的概念。该方法立即返回(准确地说,在第一个异步await里面),然后就没有办法处理它的完成或任何可能在里面抛出的错误。按原样,async void方法仅适用于事件处理程序 https://stackoverflow.com/q/19415646/1768303,前提是在方法内处理异常try/catch.

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

nUnit Assert.That委托并发问题 的相关文章

随机推荐

  • 隐式强制转换对委托类型推断的意外影响

    我有一个简单的Money带有隐式转换的类型decimal struct Money decimal innerValue public static implicit operator Money decimal value return
  • 在 Applescript 中监控 Spotify 曲目变化?

    我正在尝试找出通过 Spotify 的 Applescript 库检测曲目更改的最佳方法 到目前为止 我已经尝试检查玩家位置 如果它等于 0 则它是一个新曲目 并且咆哮通知会再次出现 如果有人重新开始一首歌等 这通常不起作用 我想知道是否更
  • 为什么复制构造函数会有多个参数?

    12 8 2 非模板构造函数 对于类 X 是一个复制构造函数 如果 它的第一个参数是 X 类型 const X 易失性 X 或 const 易失性 X 并且要么没有 其他参数或其他所有 参数有默认参数 8 3 6 106 到目前为止 我还没
  • 似乎找不到循环 PL/SQL 数组的方法?

    我正在尝试这样做 arrCauses APEX UTIL STRING TO TABLE P1 CAUSE FOR c IN 1 arrCauses count LOOP INSERT INTO DT EVENT CAUSE EVENT I
  • 量角器未连接到 DevTools

    当我的页面从 Protractor 运行时 如何使用 Chrome 开发者工具来检查它 当我尝试打开开发工具时 我从量角器收到此错误 UnknownError disconnected not connected to DevTools S
  • 如何设置 1dCNN+LSTM 网络(Keras)的输入形状?

    我有以下想法要实施 Input gt CNN gt LSTM gt Dense gt Output 输入有 100 个时间步长 每个步长有一个 64 维特征向量 A Conv1D层将在每个时间步提取特征 CNN 层包含 64 个滤波器 每个
  • 在自定义 UITableView 中显示空白 UITableViewCell

    我正在尝试自定义 UITableView 到目前为止 看起来不错 但是当我使用自定义 UITableViewCell 子类时 当只有 3 个单元格时 我不会得到空白表格单元格 替代文本 http img193 imageshack us i
  • 如何在 Swift 2.0 中将结构保存到 NSUserDefaults

    我有一个名为Jar我想将它们的数组保存到 NSUserDefaults 中 这是 jar 结构代码 struct Jar let name String let amount Int init name String amount Int
  • Apache Tomahawk 文件上传不工作

    我在使用 Apache Tomahawk 时遇到问题 Glassfish 3 0 1 不断记录 警告 JSF1064 无法从库 org apache myfaces custom 中找到或提供资源 inputFileUpload xhtml
  • 如何从我的应用程序打开“设置”应用程序? [复制]

    这个问题在这里已经有答案了 在我正在开发的 iPhone 应用程序中 用户需要通过设置应用程序输入一些配置 然后我的应用程序才能连接到服务器并运行 现在 当用户首次启动我的应用程序时 我会显示一条警报 解释用户应该转到设置 输入配置详细信息
  • 在打字稿中读取和写入文本文件

    我应该如何从 Node js 中的 TypeScript 读取和写入文本文件 我不确定是否会在 node js 中读 写沙箱文件 如果没有 我相信应该有一种访问文件系统的方法 相信应该有一种访问文件系统的方法 Include node d
  • 将 SQL 读取到 DataSet 到 XmlDocument

    下面的代码工作起来很梦幻 但它能变得更紧凑 更接近 C 风格吗 尤其是我对两个问题有怀疑 是不是很丑 老C式 填充fill通过将变量用作参数内 代码可以变得更紧凑而不是通过String C String connectionString s
  • Android TableLayout 宽度

    我有两列TableLayout作为滚动视图的唯一子视图 第一列包含TextViews labels 并且第二列包含EditText Spinner DateWidget等等 价值观 尽管我已指定android layout width fi
  • 列出 C 常量/宏

    有没有办法使GNU C 预处理器 cpp 或其他一些工具 列出给定点上的所有可用宏及其值C file 我正在寻找特定于系统的宏 同时移植一个已经精通 UNIX 的程序并加载一堆稀疏的 UNIX 系统文件 只是想知道是否有比寻找定义更简单的方
  • 最近的 Facebook API 的 FQLQuery

    我下载了最新的 Facebook PHP SDK 当我想要获取有关帖子的信息 例如点赞数 评论数和分享数 时 我的查询可以正常工作 但是 当我想获取用户的好友数量时 它不起作用并告诉我 Facebook FacebookAuthorizat
  • 将列表元素分组到字典中

    我有一个包含 8 个元素的列表 ConfigFile ControllerList 该列表的类型为 List
  • 保存在 ImageView 中时,从自定义相机拍摄的图像会被拉伸

    我正在使用此代码在 Imageview 中保存图片 但在 imageview 中保存时图像被拉伸 相机预览是完美的 单击右侧图像 但是当我在 imageview 中设置该图像时 图像被拉伸 public void onPicTaken by
  • 如何获取组件类中的ngForm变量引用?

    鉴于以下 html
  • 检索形状的名称

    在 Excel 中 左上角有 名称框 但我找不到在 Word 中检索形状名称的方法 我怎么做 MS Word 中有两种形状 InlineShapes and Shapes 使用一些 VBA 代码检查形状对象的名称非常容易 选择形状 按 Al
  • nUnit Assert.That委托并发问题

    我的代码中遇到了一些暂时的死锁 无法解决它 简单的代码 我无法创建一个简单的调用链来重现代码InvokeChangeEvent Test public async void Test sut InvokeChangeEvent foo fi