我无法解决以下错误。我很感激你的帮助。
我有以下课程:
public class GB
{
private StreamReader sr;
public GB()
{
sr = new StreamReader(new FileStream("C:\\temp.txt", FileMode.Open, FileAccess.ReadWrite));
}
public int MultiCall()
{
if (sr.ReadLine() == "test1")
return 1;
else
return 0;
}
}
在我的表单中,有一个带有以下功能的按钮;
void buttonClick()
{
myAssembly = Assembly.LoadFrom(dllpath); // dllpath is the dll file for GB class
myType = myAssembly .GetType("GB");
myObject = Activator.CreateInstance(myType);
myMethodInfo = myType .GetMethod("MultiCall");
returnValue = myMethodInfo.Invoke(myObject, null);
myObject = null;
}
这是我的问题;当我第一次点击按钮时,一切都OK。但当我再次点击它时,我得到以下错误;
该进程无法访问文件'C:\ temp.txt',因为它正由另一个进程使用。
第一次调用后,从activator.createinstance返回的对象似乎没有被取消。虽然我通过myObject = null
将其分配给空值但我仍然得到相同的错误。有什么想法吗?
THX。
答案 0 :(得分:1)
GB
的构造函数打开文件的ReadWrite
流,但从不关闭它。随后调用GB
会尝试打开同一个文件,但这显然会失败。
您需要做的是在IDisposable
上实施GB
,它会处理StreamReader
,例如:
public class GB : IDisposable
{
private StreamReader sr;
private bool _isDisposed;
public GB()
{
sr = new StreamReader(new FileStream("C:\\temp.txt", FileMode.Open, FileAccess.ReadWrite));
}
public int MultiCall()
{
if (sr.ReadLine() == "test1")
return 1;
else
return 0;
}
~GB()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool isManaged)
{
if(_isDisposed)
return;
if(isManaged)
{
// Ensure we close the file stream
sr.Dispose();
}
_isDisposed = true;
}
}
完成后再处理GB
个实例。
// Dispose of the GB instance (which closes the file stream)
var asDisposable = (IDisposable)myObject;
asDisposable.Dispose();
出于这个原因, IDisposable
存在,以确保成功释放非托管资源。
答案 1 :(得分:0)
存储文件返回的值,然后在MultiCall
方法中检查它的值。通过这种方式,您的文件将被关闭并为您处理。
public class GB
{
private string str;
public GB()
{
using (var sr = new StreamReader(new FileStream("C:\\temp.txt", FileMode.Open, FileAccess.ReadWrite)))
{
str = sr.ReadToEnd();
}
}
public int MultiCall()
{
if (str == "test1")
return 1;
else
return 0;
}
}