限制文件操作

问题描述 投票:1回答:2

我有一个字节数组,我想在文件中保留。但是,我不希望每次更新时都写入文件,因为它可以非常频繁地更新。目前我计划使用类似于以下的方法;

class ThrottleTest
{
    private byte[] _internal_data = new byte[256];

    CancellationTokenSource _cancel_saving = new CancellationTokenSource();

    public void write_to_file()
    {
        Task.Delay(1000).ContinueWith((task) =>
        {
            File.WriteAllBytes("path/to/file.data", _internal_data);
        }, _cancel_saving.Token);
    }

    public void operation_that_update_internal_data()
    {
        // cancel writing previous update
        _cancel_saving.Cancel();
        /*
         *  operate on _internal_data
         */

        write_to_file();
    }

    public void another_operation_that_update_internal_data()
    {
        // cancel writing previous update
        _cancel_saving.Cancel();
        /*
         *  operate on _internal_data
         */

        write_to_file();
    }
}

我不认为这种方法会起作用,因为当我取消一次令牌时,它将永远被取消,所以它永远不会写入文件。

首先,我想知道我是否在正确的轨道上,并且上面的代码可以使用。如果不是,那么实现这种行为的最佳方法是什么。此外,是否有一种实用的方法可以将其推广到Dictionary<string,byte[]>,其中任何byte[]都可以独立修改?

c# task throttling
2个回答
0
投票

我会先取消先前的操作,然后开始写入文件。我还会在Delay任务中包含取消令牌。

CancellationTokenSource _cancel_saving;

public void write_to_file()
{
    _cancel_saving?.Cancel();
    _cancel_saving = new CancellationTokenSource();
    Task.Delay(1000, _cancel_saving.Token).ContinueWith((task) =>
    {
        File.WriteAllBytes("path/to/file.data", _internal_data);
    }, _cancel_saving.Token);
}

0
投票

您应该使用Microsoft的Reactive Framework(又名Rx) - NuGet System.Reactive并添加using System.Reactive.Linq; - 然后您可以这样做:

public class ThrottleTest
{
    private byte[] _internal_data = new byte[256];

    private Subject<Unit> _write_to_file = new Subject<Unit>();

    public ThrottleTest()
    {
        _write_to_file
            .Throttle(TimeSpan.FromSeconds(1.0))
            .Subscribe(_ => File.WriteAllBytes("path/to/file.data", _internal_data));
    }

    public void write_to_file()
    {
        _write_to_file.OnNext(Unit.Default);
    }

    public void operation_that_update_internal_data()
    {
        /*
         *  operate on _internal_data
         */

        write_to_file();
    }

    public void another_operation_that_update_internal_data()
    {
        /*
         *  operate on _internal_data
         */

        write_to_file();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.