有人可以帮助我发现这里的错误吗?
accessor.Dispose();
导致编译器错误,但仅在Read方法中。写入编译没有阅读,所以我很困惑......
public bool Read(ref byte[] bytes)
{
MemoryMappedViewAccessor accessor;
Lock.WaitOne();
try
{
accessor = Mmf.CreateViewAccessor(0, DataLength);
bytes = new byte[DataLength];
accessor.ReadArray<byte>(0, bytes, 0, DataLength);
}
catch
{
return false;
}
finally
{
accessor.Dispose();
Lock.ReleaseMutex();
}
return true;
}
public bool Write(byte[] bytes)
{
MemoryMappedViewAccessor accessor;
Lock.WaitOne();
try
{
DataLength = bytes.Length;
accessor = Mmf.CreateViewAccessor(0, bytes.Length);
accessor.WriteArray<byte>(0, bytes, 0, bytes.Length);
}
catch
{
return false;
}
finally
{
Dispose();
Lock.ReleaseMutex();
}
return true;
}
答案 0 :(得分:2)
可能的情况是,try
内部和accessor
之前的异常被赋予一个值。有些方法可能会发生:
至于该怎么做;有两个简单的选项:
using
,以便编译器可以为您完成所有工作。accessor
初始化为null
,并且只有在它为非空的情况下才会将其丢弃。答案 1 :(得分:1)
问题是你正在使用变量,但如果抛出异常,它可能无法初始化。
我会重构这个以使用using
块代替:
public bool Read(ref byte[] bytes)
{
Lock.WaitOne();
try
{
using (MemoryMappedViewAccessor accessor = Mmf.CreateViewAccessor(0, DataLength))
{
bytes = new byte[DataLength];
accessor.ReadArray<byte>(0, bytes, 0, DataLength);
return true;
}
}
catch
{
return false;
}
finally
{
Lock.ReleaseMutex();
}
}
替代方法是初始化为null
内联,然后在调用null
之前检查Dispose
,但这需要更多代码,其中使用块简化了整体代码。
答案 2 :(得分:1)
您应该在Read
和Write
方法中遇到相同的错误,但Write
方法中的代码是错误的,因此可以避免错误。
在Write
中你有:
finally
{
Dispose();
Lock.ReleaseMutex();
}
但应该是:
finally
{
accessor.Dispose();
Lock.ReleaseMutex();
}
编译器错误是因为有可能在finally
块中结束而没有将值赋给accessor
。如果在创建分配给变量的对象时遇到异常,则会发生这种情况。
要修复编译器错误,您可以在null
块之前为accessor
变量设置try
值:
MemoryMappedViewAccessor accessor = null;
然后在finally
块中检查是否有一个实际的对象要处置:
finally
{
if (accessor != null) {
accessor.Dispose();
}
Lock.ReleaseMutex();
}
答案 3 :(得分:0)
仅对变量MemoryMappedViewAccessor accessor;
进行十分转换,然后尝试在最后的Read块中使用它。所以你得到编译器error.u
但是在写中你只是调用dispose(不是accessor.Dispose())所以没有错误。可能是打字错误?
你需要在finally块之前初始化访问器。可能需要最终纠正写作。
读:
finally
{
accessor.Dispose();
Lock.ReleaseMutex();
}
写:
finally
{
Dispose();
Lock.ReleaseMutex();
}