【问题标题】:Recurring Background Task [closed]重复的后台任务[关闭]
【发布时间】: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


【解决方案1】:

这样就够了吗?您还可以通过接受委托在 while 内运行来使此类具有通用性和可重用性。我不太确定为什么你需要它成为 IDisposable...

public class Foo : IDisposable
{
    private CancellationTokenSource _tokenSource = new CancellationTokenSource();

    public Foo()
    {
        Task.Run(async () => await CleanupAsync());
    }

    public void Dispose()
    {
        _tokenSource.Cancel();
    }

    public async Task CleanupAsync()
    {
        while (!_tokenSource.Token.IsCancellationRequested)
        {
           // Do whatever cleanup you need to.

           await Task.Delay(TimeSpan.FromSeconds(5),_tokenSource.Token);
        }
    }
}

Task.Run 中的 async 和 await 可以被移除。它们只是为了清楚起见。 Task.Run(() => CleanupAsync());

【讨论】:

  • 实现 dispose 让您可以使用usingim done with this 是一个很好的可识别简写。
  • 我知道,但我怀疑他会使用一个在同一使用范围内每 5 秒执行一次操作的类。
  • 可以说,这取决于他为什么每 5 秒清理一次——这本身就是一种奇怪的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多