gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:06:44 25 4
gpt4 key购买 nike

考虑以下场景......

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 方法不依赖于任何已释放的资源。

最佳答案

处置没有什么神奇之处。 Dispose 方法被调用 - 如果您没有影响任务使用的任何东西,那应该没问题。

同样,将 fp 设置为 null just 会阻止 fp 被视为 GC 根......尽管除非你正在做任何其他事情在后面的代码中,fp 无论如何都不会被视为 GC 根。

异步操作仍然有一个对其调用的对象的引用。如果它使用任何字段,这将阻止对象被垃圾收集。如果没有,引用的性质(可能通过回调中的委托(delegate))可能无论如何都会阻止它被垃圾回收,但值得一提的是,一个对象有可能被当实例方法“在”其中运行时收集垃圾。

但是这里没有任何东西可以停止任务或异步方法,不。

关于c# - 在任务异步运行时处置对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45563330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com