我在这里遇到一个小问题: 我使用serialport通信 - 我所有的comm功能。被包装到我自己的serialport类中。 该类的实例应该只在
中使用 using(Serport port = new Serport(...)){}
确保在操作后调用Dispose()。
现在这对一次性调用没问题,但我想不出办法: 我有一个应该通过while循环调用的函数,用于永久刷新via comport,直到用户中断(该函数被设计为每次调用时自动重置一个定时器,不再调用时超时)。 现在这个操作非常关键,每次调用时都无法打开和关闭serialport。所以在那个函数内部使用使用模式将不起作用(或者它会吗?) 实现这一点的唯一方法我可以想到的是将while(){}放在while循环中 - 我想避免这种情况,因为它会混淆我的代码,这种代码显然是以某种方式构建的,是处理低水平和真正的应用程序只有完成所有工作的简单功能是可用的...
你们有没有看到其他选择?有没有办法手动终止使用模式?只是在我的超时定时器中手动调用Dispose()将无法工作,因为如果我得到异常将无法调用它 - 我必须确保调用Dispose(),因此serialport保持可管理性......
感谢您的帮助!!
答案 0 :(得分:1)
您不需要为IDisposable使用using
语句:
来自MSDN:
using语句确保了这一点 即使异常,也会调用Dispose 在调用方法时发生 在对象上。你可以实现 通过放置对象得到相同的结果 在try块内,然后调用 在最后一个块中处理;事实上, 这就是using语句的用法 由编译器翻译。代码 早先的例子扩展到了 在编译时跟随代码(注意 额外的花括号来创造 对象的范围有限):
{ Font font1 = new Font("Arial", 10.0f); try { byte charset = font1.GdiCharSet; } finally { if (font1 != null) ((IDisposable)font1).Dispose(); } }
您可以确保您的异常处理 调用Dispose,或者您可以例如从IDisposable继承一些外部Parent类:
void Parent.Dispose()
{
if (port != null)
{
port.Dispose();
}
}
并在using
语句中包装Parent对象的创建,并让 it 担心在Serport上调用Dispose。
答案 1 :(得分:0)
您希望在整个会话期间打开串口,因为如果您经常打开/关闭它,您肯定会丢失数据并破坏您想要的任何协议。
如果你想在其他几个对象之间共享你的串行通信,那就完全不同了。
因此,尝试打开一次,关闭并在不再需要时将其丢弃。
结论:使用'使用'在这里不太实用。