public async Task GetObject_SharedMemoryObject_VerifyMatches(string content) { using (SharedMemoryManager manager = new SharedMemoryManager(_loggerFactory, _mapAccessor)) { // Put content into shared memory SharedMemoryMetadata metadata = await manager.PutObjectAsync(content); // Get object from shared memory object readObject = await manager.GetObjectAsync(metadata.MemoryMapName, 0, content.Length, typeof(SharedMemoryObject)); SharedMemoryObject readContent = readObject as SharedMemoryObject; Stream readContentStream = readContent.Content; Assert.NotNull(readContentStream); Assert.Equal(metadata.MemoryMapName, readContent.MemoryMapName); Assert.Equal(metadata.Count, readContent.Count); using (StreamReader reader = new StreamReader(readContentStream)) { string readContentString = await reader.ReadToEndAsync(); // Verify read content matches the content that was written Assert.Equal(content, readContentString); } } }
static void Main(string[] args) { Console.WriteLine($"Process start (EnvironmentVersion:{Environment.Version.ToString()} ProcessName:{Process.GetCurrentProcess().ProcessName} Is64BitProcess:{Environment.Is64BitProcess})"); Console.WriteLine("Press Enter:Add shared memory value\nPress Q:Exit\n"); using (var shareMem = new SharedMemoryObject <double>("Memory1", Length)) { var span = shareMem.AsSpan(); while (true) { var keyInfo = Console.ReadKey(true); var rand = new Random(); switch (keyInfo.Key) { case ConsoleKey.Enter: for (int i = 0; i < Length; i++) { var addVal = rand.NextDouble(); span[i] += addVal; Console.WriteLine($"span[{i}]={span[i]} (+{addVal})"); } break; case ConsoleKey.Q: return; } } } }
public async Task ToObject_Bytes_FunctionDataCacheEnabled_VerifySuccess() { ILogger <RpcSharedMemory> logger = NullLogger <RpcSharedMemory> .Instance; string invocationId = Guid.NewGuid().ToString(); long contentSize = 16 * 1024; // 16KB, enough to try out the functionality we need to test using (SharedMemoryManager manager = new SharedMemoryManager(_loggerFactory, _mapAccessor)) { // Create a SharedMemoryMap string mapName = Guid.NewGuid().ToString(); SharedMemoryMap sharedMemoryMap = CreateSharedMemoryMap(mapName, contentSize); // Wite content into it byte[] content = TestUtils.GetRandomBytesInArray((int)contentSize); long bytesWritten = await sharedMemoryMap.PutBytesAsync(content); Assert.Equal(contentSize, bytesWritten); // Create a RpcSharedMemory object pointing to the shared memory region we created earlier RpcSharedMemory rpcSharedMemory = new RpcSharedMemory { Name = mapName, Count = contentSize, Offset = 0, Type = RpcDataType.Bytes }; // Convert RpcSharedMemory object into byte[] object rpcObj = await rpcSharedMemory.ToObjectAsync(logger, invocationId, manager, isFunctionDataCacheEnabled : true); Assert.NotNull(rpcObj); // Since the FunctionDataCache is enabled, the object should be a SharedMemoryObject Assert.IsType <SharedMemoryObject>(rpcObj); SharedMemoryObject sharedMemoryObject = rpcObj as SharedMemoryObject; // Verify that the read object is correct Assert.Equal(mapName, sharedMemoryObject.MemoryMapName); Assert.Equal(contentSize, sharedMemoryObject.Count); // Since the FunctionDataCache is enabled, ensure that the SharedMemoryManager is tracking the object that was read Assert.Equal(1, manager.AllocatedSharedMemoryMaps.Count); Assert.True(manager.AllocatedSharedMemoryMaps.TryGetValue(mapName, out _)); // Dispose off the created resources sharedMemoryMap.Dispose(); } }