我偶然发现了一个非常奇怪的错误。在第一个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
引起的。
答案 0 :(得分:4)
进程退出代码并不意味着那么多,您更喜欢看到调试器停止告诉您未处理的异常。但是可以肯定,这是不健康的。它们don't like XML文件,这是一个反恶意软件引起的问题。通常,它们是程序员机器上的一个问题,它们也不喜欢看起来似乎无处出现的可执行文件,这些文件是由使用进程互操作的进程(如IDE确实运行msbuild)创建的。强大的恶意软件信号。因此,您要做的第一件事就是暂时将其关闭,看看是否可以解决问题。
可以肯定的是,您接下来要做的是切换到较不积极的地方。操作系统提供的反恶意软件解决方案永远不会遇到这种情况。如果您使用Avast或其他具有“深度扫描”模式的产品,则请尽快卸载。
并担心您的用户可能使用什么,从FileStream获取IOException非常正常,因此非常需要try / catch。通常,您不想覆盖毫秒前创建的文件或删除目录,幸运的是,这绝不是明智的选择。