public async Task AnonymousPipeWriteViaFileStream(bool asyncWrites) { using (var server = new AnonymousPipeServerStream(PipeDirection.In)) { Task serverTask = Task.Run(() => { for (int i = 0; i < 6; i++) Assert.Equal(i, server.ReadByte()); }); using (var client = new FileStream(new SafeFileHandle(server.ClientSafePipeHandle.DangerousGetHandle(), false), FileAccess.Write, bufferSize: 3)) { var data = new[] { new byte[] { 0, 1 }, new byte[] { 2, 3 }, new byte[] { 4, 5 } }; foreach (byte[] arr in data) { if (asyncWrites) await client.WriteAsync(arr, 0, arr.Length); else client.Write(arr, 0, arr.Length); } } await serverTask; } }
public async Task NamedPipeWriteViaAsyncFileStream(bool asyncWrites) { string name = Guid.NewGuid().ToString("N"); using (var server = new NamedPipeServerStream(name, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous)) { Task serverTask = Task.Run(async () => { await server.WaitForConnectionAsync(); for (int i = 0; i < 6; i++) Assert.Equal(i, server.ReadByte()); }); WaitNamedPipeW(@"\\.\pipe\" + name, -1); using (SafeFileHandle clientHandle = CreateFileW(@"\\.\pipe\" + name, GENERIC_WRITE, FileShare.None, IntPtr.Zero, FileMode.Open, (int)PipeOptions.Asynchronous, IntPtr.Zero)) using (var client = new FileStream(clientHandle, FileAccess.Write, bufferSize: 3, isAsync: true)) { var data = new[] { new byte[] { 0, 1 }, new byte[] { 2, 3 }, new byte[] { 4, 5 } }; foreach (byte[] arr in data) { if (asyncWrites) await client.WriteAsync(arr, 0, arr.Length); else client.Write(arr, 0, arr.Length); } } await serverTask; } }
public static IEnumerable<object[]> File_AllDataCopied_MemberData() { bool[] bools = new[] { true, false }; foreach (bool useAsync in bools) // sync or async mode { foreach (bool preRead in bools) // whether to do a read before the CopyToAsync { foreach (bool cancelable in bools) // whether to use a cancelable token { for (int streamType = 0; streamType < 2; streamType++) // kind of stream to use { Func<string, Stream> createDestinationStream; switch (streamType) { case 0: createDestinationStream = _ => new MemoryStream(); break; default: createDestinationStream = s => File.Create(s); break; } // Various exposeHandle (whether the SafeFileHandle was publically accessed), // preWrite, bufferSize, writeSize, and numWrites combinations yield return new object[] { createDestinationStream, useAsync, preRead, false, false, cancelable, 0x1000, 0x100, 100 }; yield return new object[] { createDestinationStream, useAsync, preRead, false, false, cancelable, 0x1, 0x1, 1000 }; yield return new object[] { createDestinationStream, useAsync, preRead, false, true, cancelable, 0x2, 0x100, 100 }; yield return new object[] { createDestinationStream, useAsync, preRead, false, false, cancelable, 0x4000, 0x10, 100 }; yield return new object[] { createDestinationStream, useAsync, preRead, false, true, cancelable, 0x1000, 99999, 10 }; } } } } }