第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

限制文件操作

限制文件操作

C#
Smart貓小萌 2022-11-21 15:45:04
我有一個字節(jié)數(shù)組,我想保存在一個文件中。但是,我不想每次更新都寫入文件,因為它可以非常頻繁地更新。目前我正計劃使用類似于以下的方法;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();    }}我認(rèn)為這種方法行不通,因為當(dāng)我取消令牌一次時,它將永遠取消,因此它永遠不會寫入文件。首先,我想知道我是否在正確的軌道上,上面的代碼是否可以工作。如果沒有,實現(xiàn)此行為的最佳方法是什么。此外,是否有一種實用的方法可以將其推廣到Dictionary<string,byte[]>anybyte[]可以獨立修改的地方?
查看完整描述

3 回答

?
嗶嗶one

TA貢獻1854條經(jīng)驗 獲得超8個贊

我將通過首先取消之前的操作來開始寫入文件。我還將在延遲任務(wù)中包含取消標(biāo)記。


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);

}


查看完整回答
反對 回復(fù) 2022-11-21
?
絕地?zé)o雙

TA貢獻1946條經(jīng)驗 獲得超4個贊

你的背景對我來說似乎有點奇怪。您正在寫入所有字節(jié),而不是使用流。撇開取消令牌的問題不談,將寫入延遲 1 秒不會減少磁盤的總體負(fù)載或總體吞吐量。

這個答案有以下假設(shè):

  • 您正在使用 SSD 并且擔(dān)心硬件壽命

  • 這是一個低優(yōu)先級的活動,可以容忍一些數(shù)據(jù)丟失

  • 這不是日志記錄活動(否則附加到文件會更好地使用 a BufferedStream

  • 這可能是將序列化的 C# 對象樹保存到磁盤以防斷電

  • 您不希望對對象樹所做的每個更改都會導(dǎo)致寫入磁盤。

  • 如果對象樹沒有變化,您不想每秒都寫入磁盤。

  • 如果 N 秒內(nèi)沒有寫入,它應(yīng)該立即寫入磁盤

  • 如果最近有寫入,它應(yīng)該等待。

將 WriteAllBytes 步驟作為節(jié)流點并不理想。

用法:

rootObject.subObject.value = 9;
rootObject.Save(token);

支持代碼:


TimeSpan minimumDiskInterval = TimeSpan.FromSeconds(60);

DateTime lastSaveAt = DateTime.MinValue;

bool alreadyQueued = false;

public void Save(CancellationToken token)

{

    if (alreadyQueued) //TODO: Interlocked with long instead for atomic memory barrier

        return;

        

    alreadyQueued = true; //TODO: Interlocked with long instead for atomic memory barrier


    var thisSaveAt = DateTime.UtcNow;

    var sinceLastSave = thisSaveAt.Subtract(lastSaveAt);

    var difference = TimeSpan.TotalSeconds - sinceLastSave.TotalSeconds;

    if (difference < 0)

    { 

        

        //It has been a while - no need to delay

        SaveNow();

    }

    else

    {

        //It was done recently

        

    T   Task.Delay(TimeSpan.FromSeconds(difference).ContinueWith((task) =>

        {

            SaveNow();

        }, _cancel_saving.Token);   

    }

}


object fileAccessSync = new object();

public void SaveNow()

{

    alreadyQueued = false; //TODO: Interlocked with long instead for atomic memory barrier

    byte[] serializedBytes = Serialise(this)

    lock (fileAccessSync)

    {

        File.WriteAllBytes("path/to/file.data", serializedBytes);

    }

}


查看完整回答
反對 回復(fù) 2022-11-21
?
拉莫斯之舞

TA貢獻1820條經(jīng)驗 獲得超10個贊

您應(yīng)該使用 Microsoft 的 Reactive Framework(又名 Rx)- NuGetSystem.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();

    }

}


查看完整回答
反對 回復(fù) 2022-11-21
  • 3 回答
  • 0 關(guān)注
  • 91 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號