using System; using System.IO; using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using Windows.Storage.Streams; namespace Plane.Communication { /// /// 所有以字节流形式进行通信的 实现者的基类。 /// public abstract class StreamConnection : ExceptionThrownEventSource, IConnection { protected bool _canFlush = true; protected IInputStream _inputStream; protected Stream _outputStream; private bool _reopening; public bool IsOpen { get; protected set; } public virtual void Close() { IsOpen = false; try { _inputStream?.Dispose(); } catch { } try { _outputStream?.Dispose(); } catch { } } public abstract Task OpenAsync(); public virtual async Task ReadAsync(byte[] buffer, int offset, int count) { try { IBuffer buf = new Windows.Storage.Streams.Buffer((uint)count); buf = await _inputStream.ReadAsync(buf, (uint)count, InputStreamOptions.None); buf.CopyTo(0, buffer, offset, count); return count; } catch (Exception ex) { RaiseExceptionThrown(ex); await ReopenIfNeededAsync(); return 0; } } public virtual async Task WriteAsync(byte[] buffer, int offset, int count) { try { await _outputStream.WriteAsync(buffer, offset, count).ConfigureAwait(false); if (_canFlush) { await _outputStream.FlushAsync().ConfigureAwait(false); } } catch (NotImplementedException) // 不支持 Flush。 { _canFlush = false; } catch (Exception ex) { RaiseExceptionThrown(ex); await ReopenIfNeededAsync(); } } private async Task ReopenIfNeededAsync() { if (!_reopening) { _reopening = true; Close(); try { await OpenAsync(); } catch (Exception ex) { RaiseExceptionThrown(ex); await Task.Delay(1000); } _reopening = false; } } } }