Sri*_*ake 7 .net methods idisposable parameter-passing disposing
将IDisposable作为参数传递给方法并将其置于该方法中是一种好习惯.当你必须使用多个线程时,这是不可避免的.好吧,最佳实践说主人(来电者)应该处理它.
例如
public void MyMethod(MyClass reader){
using(reader){
//some code
}
}
Run Code Online (Sandbox Code Playgroud)
如果所有者(创建线程)不再存在怎么办?例如
interface IReader : IDisposable {
string Read();
}
public class MyReader : IReader {
public string Read()
{
return "hellow world";
}
public void Dispose()
{
//dispose code
}
}
Run Code Online (Sandbox Code Playgroud)
在这里你会发现问题......
public void Start() {
MyReader[] readerSet = new MyReader[5];
for (int i = 0; i < readerSet.Length; i++) {
readerSet[i] = new MyReader();
}
foreach (IReader reader in readerSet) {
ThreadPool.QueueUserWorkItem(new WaitCallback(Run), reader);
}
//exit after creating threads
}
public void Run(Object objReader) {
IReader reader = (IReader)objReader;
using (reader) {
//use the reader
}
}
Run Code Online (Sandbox Code Playgroud)
我认为你最好选择一个创作委托来保证对象的处理.
例
public void Start() {
var makeReader = new Func<IReader>(() => new MyReader());
for (int i = 0; i < 5; i++) {
ThreadPool.QueueUserWorkItem(Run, makeReader);
}
}
public void Run(Object state) {
var makeReader = (Func<IReader>)state;
using (var reader = makeReader()) {
//use the reader
}
}
Run Code Online (Sandbox Code Playgroud)