private Task Start() { IoAsyncMachine self = this; _atm.Start(ref self); return(_atm.Task); }
void IAsyncStateMachine.MoveNext() { try { switch (_state) { case 0: { _state = 1; _fs = new FileStream( _filePath, //string path, FileMode.Create, //FileMode mode, FileAccess.Write, //FileAccess access, FileShare.None, //FileShare share, 4096, //int bufferSize, FileOptions.Asynchronous //,//FileOptions options ); _buffer = new byte[4097]; Task twrite = _fs.WriteAsync(_buffer, 0, _buffer.Length); _awaiter = twrite.GetAwaiter(); if (_awaiter.IsCompleted) { goto case 1; } else { IoAsyncMachine self = this; _atm.AwaitUnsafeOnCompleted(ref _awaiter, ref self); } } break; case 1: { _state = 2; Task tflush = _fs.FlushAsync(); _awaiter = tflush.GetAwaiter(); if (_awaiter.IsCompleted) { goto case 2; } else { IoAsyncMachine self = this; _atm.AwaitUnsafeOnCompleted(ref _awaiter, ref self); } } break; case 2: { _state = 3; _fs.Dispose(); _atm.SetResult(); } break; case 3: { _state = 4; throw new Exception("should not go here!"); } break; } } catch (Exception ex) { _atm.SetException(ex); } }
public static Task IoAsync(string filePath) { var stateMachine = new IoAsyncMachine(filePath); return(stateMachine.Start()); }