我工作的很多项目的线程实现都很差,而且我是那些必须跟踪它们的傻瓜.是否有一种可接受的最佳方式来处理线程.我的代码总是在等待一个永不激活的事件.
我有点像设计模式或其他东西.
我喜欢C#,因为.NET框架的强大功能使得它很容易为Windows开发.但是我也喜欢标准的C++,主要是因为它让我对内存管理进行了微调.有没有办法让两全其美?是否有可以与.NET框架中丰富的库集竞争的C++库?或者有没有办法手动释放我从未使用过的.NET语言中的内存?或者是否可以在标准C++应用程序中使用.NET dll?我知道,我真的在这里伸展,但我相信魔法.
我写了一段代码。我想确保我以正确的方式处理对象。
我有一个像这样的一次性类,用于从非托管资源读取一些数据。
class MyFileReader : IDisposable
{
private readonly FileStream _stream;
public MyFileReader(FileStream stream)
{
_stream = stream;
}
public void Dispose()
{
_stream.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
目前在我的程序中,我像这样处理对象。
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (MyFileReader reader = new MyFileReader(stream))
{
//...
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎没问题。后来我注意到类是通过引用传递的,所以也许如果我处理其中一个,就不需要处理另一个。
我的问题是我可以做这样的事情吗?
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
MyFileReader reader = new MyFileReader(stream);
// Remove IDisposable from MyFileReader and stream will close after using.
}
Run Code Online (Sandbox Code Playgroud)
还是这个?
FileStream stream = …Run Code Online (Sandbox Code Playgroud) 据我所知,如果你有一个具有IDisposable的成员m的A类,A应该实现IDisposable,它应该在其中调用m.Dispose().
我找不到令人满意的理由,为什么会这样.
我理解规则如果你有非托管资源,你应该提供一个终结器和IDisposable,这样如果用户没有显式调用Dispose,终结器仍然会在GC期间清理.
但是,根据该规则,您似乎不需要具有此问题的规则.例如...
如果我有课:
class MyImage{
private Image _img;
... }
Run Code Online (Sandbox Code Playgroud)
公约规定我应该有MyImage : IDisposable.但是如果Image遵循惯例并实现了终结器而我并不关心资源的及时发布,那有什么意义呢?
UPDATE
我在这里找到了一个很好的讨论.