FileMemory
FileMemory opens a file handle and memory access to it.
using IMemory<byte> file = new FileMemory("file.tmp", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
file.Count = 1024;
for (int i = 0; i < file.Count; i++) file[i] = (byte)i;
file.Flush();
.AddDisposeAction() attaches post-dispose action (Extension method from Avalache.Utilities).
IMemory<byte> file = new FileMemory("file.tmp", FileMode.Create)
.AddDisposeAction((FileMemory fm) => File.Delete(fm.FilePath!));
file.Count = 1024;
for (int i = 0; i < file.Count; i++) file[i] = (byte)i;
file.Flush();
file.Dispose(); // Closes file handle and then deletes file.
Concurrency
.Synchronized() decorates with mutex locking for concurrent thread use.
using IMemory<byte> file = new FileMemory("file.tmp", FileMode.Create).Synchronized();
Parallel.For(0, 1024, (int i) => file.Add((byte)i));
file.Flush();
.Synchronized(mLock) decorates with specific monitor object.
object mLock = new();
using IMemory<byte> file = new FileMemory("file.tmp", FileMode.Create).Synchronized(mLock);
Parallel.For(0, 1024, (int i) => { lock (mLock) file.Add((byte)i); });
file.Flush();
Full Example
Full example
using Avalanche.Memory;
using Avalanche.Utilities;
public class filememory
{
public static void Run()
{
{
// <01>
using IMemory<byte> file = new FileMemory("file.tmp", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
file.Count = 1024;
for (int i = 0; i < file.Count; i++) file[i] = (byte)i;
file.Flush();
// </01>
}
{
// <02>
IMemory<byte> file = new FileMemory("file.tmp", FileMode.Create)
.AddDisposeAction((FileMemory fm) => File.Delete(fm.FilePath!));
file.Count = 1024;
for (int i = 0; i < file.Count; i++) file[i] = (byte)i;
file.Flush();
file.Dispose(); // Closes file handle and then deletes file.
// </02>
}
{
// <11>
using IMemory<byte> file = new FileMemory("file.tmp", FileMode.Create).Synchronized();
Parallel.For(0, 1024, (int i) => file.Add((byte)i));
file.Flush();
// </11>
}
{
// <12>
object mLock = new();
using IMemory<byte> file = new FileMemory("file.tmp", FileMode.Create).Synchronized(mLock);
Parallel.For(0, 1024, (int i) => { lock (mLock) file.Add((byte)i); });
file.Flush();
// </12>
}
}
}