我偶然发现了非常奇怪的错误。FileStream在第一个应用程序中使用时,using会遍历循环并打印出“Done”,但是,它是exits with the error code 5. Try/Catch也不行。
这似乎是非常脆弱的错误状态,因为如果我摆弄文件名(例如C:\TFS\file1.xml.No.xml-> C:\TFS\file1.xml.N.xml),那么它工作正常。
如果我var tw = File.CreateText在第一次使用中使用,那么应用程序exits with the code 1073741845。对于可重现的示例,我已设法将问题显着减少到以下几行代码。
也许有人可以解释为什么这会表现得如此奇怪?我也对为什么我无法从这个错误状态中恢复感兴趣?我试过了[HandleProcessCorruptedStateExceptions],[SecurityCritical]没有效果。
static void Main(string[] args)
{
var ds = new DataSet();
for (int i = 0; i <= 2; i++)
{
using (var fs = new FileStream(@"C:\TFS\file1.xml.No.xml", FileMode.Create))
{
}
using (var tw = File.CreateText(@"C:\TFS\file1.xml"))
{
ds.WriteXml(tw);
}
Console.WriteLine($"Pass {i} done.");
}
Console.WriteLine("Done");
Console.ReadLine();
}
使用 .NET Framework 4.7 控制台应用程序项目。
编辑:
如果我Thread.Sleep(2000)输入每条using语句-然后在第二遍之后遇到此错误-它会在打印之前打印Pass 1 done.,因此写入频率似乎与此行为无关。Pass 2 done.has exited with code 5 (0x5)
在进一步修改这个小样本后 - 我可以DataSet在完全不使用并且只创建StreamWriter实例的情况下重现该问题。下面的例子应该在突然退出之前产生:
TW1 created.
TW1 flushed.
TW1 created.
TW2 flushed.
Pass 0 done.
static void Main(string[] args)
{
for (int i = 0; i <= 2; i++)
{
var tw1 = File.CreateText(@"C:\TFS\file1.xml.No.xml");
Console.WriteLine("TW1 created.");
tw1.Flush();
Console.WriteLine("TW1 flushed.");
Thread.Sleep(2000);
var tw2 = File.CreateText(@"C:\TFS\file1.xml");
Console.WriteLine("TW1 created.");
tw2.Flush();
Console.WriteLine("TW2 flushed.");
Thread.Sleep(2000);
Console.WriteLine($"Pass {i} done.");
}
Console.WriteLine("Done");
Console.ReadLine();
}
** EDIT2:** 所以在我们看来,这个问题是由Kaspersky Endpoint Security for Windows v11.
喵喵时光机
相关分类