public Task DeleteFileAsync(string key, TimeSpan?timeout = null) { if (timeout == null) { timeout = TimeSpan.FromSeconds(30); } var request = new FileDeleteRequest() { MessageId = Guid.NewGuid(), Key = key }; var bytes = SerializeManager.Current.Serialize(request); var waitItem = new FileWaitItem(request.MessageId); lock (_Sync) { _WaitDic.Add(waitItem.MessageId, waitItem); } AttachCompletionToWaitItem(waitItem, timeout.Value); SendData(bytes); return(waitItem.CompletionSource.Task); }
private void AttachCompletionToWaitItem(FileWaitItem waitItem, TimeSpan timeout) { var cancelTokenSource = new CancellationTokenSource(); Action clear = () => { lock (_Sync) { _WaitDic.Remove(waitItem.MessageId); } cancelTokenSource.Cancel(); waitItem.CancelTask = null; }; waitItem.CancelTask = Task .Delay(timeout, cancelTokenSource.Token) .ContinueWith(t => { if (t.IsCanceled) { return; } waitItem.CompletionSource?.TrySetException(new TimeoutException()); clear(); }); waitItem.CompletionSource.Task.ContinueWith(t => { var ex = t.Exception; if (ex != null) { OnException(Session, ex, disconnect: false); } clear(); }); }