在C#.NET Core应用程序中,我有一些代码可以通过将数据附加到文件流来保存更改,并且在执行此操作时我希望确保不会导致部分写入的字节。
我正在考虑通过在Task
中运行我的代码来模拟xunit测试中的崩溃,然后随机杀死Task
以查看它的行为。但Task
没有任何杀戮开关,我不能在这里使用CancellationToken
。线程曾经有Abort
但我在.NET Core中找不到它。我猜他们删除了它。您可以建议在xunit中使用的任何其他选项吗?我当然可以在一个单独的过程中运行代码,但我正在寻找一些更简单的方法。
我已经读过append在缓冲区长度上是原子的,所以如果我有足够大的缓冲区用于事务,我想我会安全吗?但我想在各种条件下对此进行测试。
更新
我将标题更改为不包括电源故障情况,只是随机崩溃。
此外,如果无法避免这种情况,因为在评论中指出写入是非原子的,那么在处理append时如何使写入更安全?如果我(编写)整个文件,我可以单独编写它,然后在完成后替换旧文件(如ms office apps和其他操作),但是当附加到文件时我想它会变得更复杂。我可以单独编写,然后以某种方式原子连接两个文件段吗?
更新2
如果有人想知道,我至少已经解决了如何真正做原子追加的问题。我只是像往常一样写字节,当事务完成时,我更新一个位置指针,指向事务的最后一个字节。我忽略了这个位置后的任何字节。似乎是最好的选择。但这不是真正的问题,即如何在xunit测试中模拟随机崩溃。