Stream View
.OpenStream() opens a Stream view to IMemory.
// Create memory
IMemory<byte> memory = new BlockMemory<byte>().RWLocked();
// Open a 'stream' view to 'memory'
using Stream stream = memory.OpenStream();
.OpenStream(fileAccess, fileShare) allows to configure file accesses.
// Open a 'stream' view to 'memory'
using Stream stream = memory.OpenStream(FileAccess.ReadWrite, FileShare.ReadWrite);
Multiple streams can be opened, however FileShare specifies exclusion policy.
try
{
// Create memory
IMemory<byte> memory = new BlockMemory<byte>();
// Open two streams with write share exclusion
using Stream stream1 = memory.OpenStream(FileAccess.ReadWrite, FileShare.Write);
using Stream stream2 = memory.OpenStream(FileAccess.ReadWrite, FileShare.Write);
}
catch (IOException)
{
// 'FileShare.Write' excludes the other read access request
}
FileShare Exclusion
.OpenStream() handles FileShare exclusion automatically.
However, explicit an openHandles context can be provided for share exclusion checks.
// Create memory
IMemory<byte> memory = new BlockMemory<byte>();
// List of open handle context for share exclusion properties
List<IFileAccess> openHandles = new();
// Open a 'stream' view to 'memory'
using var stream = new MemoryViewStream(memory, FileAccess.ReadWrite, FileShare.Write);
// Assert-and-write exclusion
FileShareContext.Instance.AddToFileShareContext(stream, openHandles);
FileShareContext.Instance.Provider provides shared openHandles context. It uses weak-keyed mapping.
// Create memory
IMemory<byte> memory = new BlockMemory<byte>();
// Create open handle context for 'memory' using weak-keyed-mapping
List<IFileAccess> openHandles = FileShareContext.Instance.Provider[memory];
// Open a 'stream' view to 'memory'
using var stream = new MemoryViewStream(memory, FileAccess.ReadWrite, FileShare.Write);
// Assert-and-write exclusion
FileShareContext.Instance.AddToFileShareContext(stream, openHandles);
Full Example
Full example
using Avalanche.Memory;
using Avalanche.Utilities;
using static System.Console;
public class streamview
{
public static void Run()
{
{
// <01>
// Create memory
IMemory<byte> memory = new BlockMemory<byte>().RWLocked();
// Open a 'stream' view to 'memory'
using Stream stream = memory.OpenStream();
// </01>
}
{
// Create memory
IMemory<byte> memory = new BlockMemory<byte>();
// <02>
// Open a 'stream' view to 'memory'
using Stream stream = memory.OpenStream(FileAccess.ReadWrite, FileShare.ReadWrite);
// </02>
}
// <03>
try
{
// Create memory
IMemory<byte> memory = new BlockMemory<byte>();
// Open two streams with write share exclusion
using Stream stream1 = memory.OpenStream(FileAccess.ReadWrite, FileShare.Write);
using Stream stream2 = memory.OpenStream(FileAccess.ReadWrite, FileShare.Write);
}
catch (IOException)
{
// 'FileShare.Write' excludes the other read access request
}
// </03>
{
// <04>
// Create memory
IMemory<byte> memory = new BlockMemory<byte>();
// List of open handle context for share exclusion properties
List<IFileAccess> openHandles = new();
// Open a 'stream' view to 'memory'
using var stream = new MemoryViewStream(memory, FileAccess.ReadWrite, FileShare.Write);
// Assert-and-write exclusion
FileShareContext.Instance.AddToFileShareContext(stream, openHandles);
// </04>
}
{
// <05>
// Create memory
IMemory<byte> memory = new BlockMemory<byte>();
// Create open handle context for 'memory' using weak-keyed-mapping
List<IFileAccess> openHandles = FileShareContext.Instance.Provider[memory];
// Open a 'stream' view to 'memory'
using var stream = new MemoryViewStream(memory, FileAccess.ReadWrite, FileShare.Write);
// Assert-and-write exclusion
FileShareContext.Instance.AddToFileShareContext(stream, openHandles);
// </05>
}
}
}