摘要:介绍一种方式控制生命周期对性能有影响的对象,以达到类似 RAII 的效果。利用 lambda 构造明确的作用域,当 lambda 执行完成后视作离开作用域。
常见方式是,对生命周期敏感的资源实现一个 IDisposable 的接口 如果觉得 IDisposable 依然不够可控,可以采取这种方式。
以一个生命周期敏感的 stream 为例, 例如 socket 的 NetworkStream, 可以这样设计 API
Task<T> GetNetworkStreamAsync<T>(Func<MyNetworkStream, Task<T>> usingStream);
使用者使用的方式
socket.GetNetworkStreamAsync(async myStream =>
{
var c = await myStream.ReadAsync(.....);
// other operations
return c;
});
API 实现
Task<T> GetNetworkStreamAsync<T>(Func<MyNetworkStream, Task<T> usingStream)
{
try
{
var myStream = CreateMyStream();
return usingStream(myStream);
}
finally
{
DestroyStream(myStream);
}
}