将IDisposable作为参数传递

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)

Cha*_*ion 6

我认为你最好选择一个创作委托来保证对象的处理.

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)