我有一个字节数组,我想在文件中保留。但是,我不希望每次更新时都写入文件,因为它可以非常频繁地更新。目前我计划使用类似于以下的方法;
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[]
都可以独立修改?
我会先取消先前的操作,然后开始写入文件。我还会在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);
}
您应该使用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();
}
}