考虑以下情况......
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方法不依赖于任何处置的资源。
答案 0 :(得分:6)
处理没有什么神奇之处。调用Dispose
方法 - 如果您不影响任务使用的任何内容,那应该没问题。
同样将fp
设置为null 只是会阻止fp
被视为GC根目录...尽管除非您以后再使用它做任何其他操作代码fp
无论如何都不会被视为GC根。
异步操作仍然引用了它所调用的对象。如果它使用任何字段,那将阻止对象被垃圾收集。如果它没有,那么引用的性质(可能是通过回调中的委托)将可能阻止它被垃圾收集,但是值得注意它和&# #39;当一个实例方法运行时,对象可能被垃圾收集"在"它
但是这里没有什么可以阻止任务或异步方法,没有。