我正在为一堂课进行一些单元测试。这个类正在处理一个文件。我已经实现了几个单元测试并自己运行它们,但是当我让它们全部同时运行时,注意到测试失败了。所以我发现VisualStudio并行运行单元测试。
为了避免在为每个测试准备文件期间出现问题,我尝试实现线程锁定。但到目前为止,这是行不通的。
跟进,我提供了一个简单的例子来解释我的问题:
[TestClass]
public class UnitTest1
{
private static object lockObject = new object();
private void DoSomething()
{
File.Create(@"D:\test.txt");
for (int i = 0; i < 100000; i++)
{
}
File.Delete(@"D:\test.txt");
}
[TestMethod]
public void TestMethod1()
{
lock (lockObject)
{
DoSomething();
}
}
[TestMethod]
public void TestMethod2()
{
lock (lockObject)
{
DoSomething();
}
}
}
测试失败,因为每个进程都无法访问该文件,因为它已经在不同的进程中使用。
有谁知道我做错了什么?
答案 0 :(得分:1)
文件本身已锁定,因为您没有丢弃FileStream
返回的File.Create
对象 - 这意味着当您尝试调用File.Delete
时文件仍处于打开状态。
在可能的情况下,最好将一次性对象(实现IDisposable
的任何内容)包装在using {}
块中,以确保资源得到妥善处理。在您的情况下,这将通过关闭文件来解决问题。
因此,将代码更改为此类代码可以解决当前问题:
private void DoSomething()
{
using (var file = File.Create(@"D:\test.txt"))
{
for (int i = 0; i < 100000; i++)
{
}
}
File.Delete(@"D:\test.txt");
}