【发布时间】:2018-05-02 16:22:16
【问题描述】:
我刚刚开始尝试使用“任务”而不是线程,并尝试使用后台“清理”任务实现一个对象,只要该对象正在使用中,该任务每 5 分钟运行一次,但不应阻塞垃圾收藏。
一些粗略的东西(显然行不通......)
public class Foo : IDisposable
{
private CancellationTokenSource _tokenSource = new CancellationTokenSource();
public Foo()
{
Cleanup();
}
public void Dispose()
{
_tokenSource.Cancel();
}
public void Cleanup()
{
Task.Delay(TimeSpan.FromSeconds(5), _tokenSource.Token).ContinueWith(t =>
{
//Do Work
if (!_tokenSource.IsCancellationRequested)
{
Cleanup();
}
}, TaskContinuationOptions.NotOnCanceled);
}
}
正确的实现方式是什么?
编辑在回答 I3arnon 的问题时,我正在使用 IDisposable,因为当我处理完对象后,我希望它被垃圾回收。比如没有下面的 f.Dispose() (取消任务,f 似乎没有被 Garbage Collected,或者清理任务被取消。有没有更好的实现方式?
var f = new Foo();
var r = new WeakReference(f);
Thread.Sleep(TimeSpan.FromSeconds(15));
f.Dispose();
f = null;
System.GC.Collect();
Thread.Sleep(TimeSpan.FromSeconds(5));
Console.WriteLine(r.IsAlive);
【问题讨论】:
-
试试Rx
-
.NET 中没有确定性的对象终结。
标签: c# task-parallel-library async-await c#-5.0