在任务运行异步时处置对象

时间:2017-08-08 08:36:14

标签: c# .net async-await dispose

考虑以下情况......

class FileProcessor : IDisposable
{
    public void Dispose()
    {
        //Disposes resources.
    }

    public async void OnNext(string fileName)
    {
        await Task.Run(() =>
        {
            var lines = File.ReadLines(fileName);
            //long processing with the lines...
        });
    }
}

class Program
{
    static void Main(string[] args)
    {
        var fp = new FileProcessor();
        fp.OnNext("some file");
        fp.OnNext("some file");

        //dispose is called and the object reference is set to null.
        fp.Dispose();
        fp = null;

        //..but the async tasks are still running...

        //Will they run to completion no matter how long they take? 

        Console.ReadKey();
    }
}

在调用dispose并将对象引用设置为null时,任务是否会运行完成?

OnNext方法不依赖于任何处置的资源。

1 个答案:

答案 0 :(得分:6)

处理没有什么神奇之处。调用Dispose方法 - 如果您不影响任务使用的任何内容,那应该没问题。

同样将fp设置为null 只是会阻止fp被视为GC根目录...尽管除非您以后再使用它做任何其他操作代码fp无论如何都不会被视为GC根。

异步操作仍然引用了它所调用的对象。如果它使用任何字段,那将阻止对象被垃圾收集。如果它没有,那么引用的性质(可能是通过回调中的委托)将可能阻止它被垃圾收集,但是值得注意它和&# #39;当一个实例方法运行时,对象可能被垃圾收集"在"它

但是这里没有什么可以阻止任务或异步方法,没有。