diff --git a/Src/Newtonsoft.Json/JsonTextReader.Async.cs b/Src/Newtonsoft.Json/JsonTextReader.Async.cs index 51370fd6..e2c67e9e 100644 --- a/Src/Newtonsoft.Json/JsonTextReader.Async.cs +++ b/Src/Newtonsoft.Json/JsonTextReader.Async.cs @@ -78,7 +78,7 @@ namespace Newtonsoft.Json return ParseObjectAsync(cancellationToken); case State.PostValue: Task task = ParsePostValueAsync(false, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { if (task.Result) { @@ -531,7 +531,7 @@ namespace Newtonsoft.Json _charPos++; Task task = EnsureCharsAsync(1, append, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { SetNewLine(task.Result); return AsyncUtils.CompletedTask; diff --git a/Src/Newtonsoft.Json/JsonTextWriter.Async.cs b/Src/Newtonsoft.Json/JsonTextWriter.Async.cs index b7414f46..41ea7980 100644 --- a/Src/Newtonsoft.Json/JsonTextWriter.Async.cs +++ b/Src/Newtonsoft.Json/JsonTextWriter.Async.cs @@ -186,7 +186,7 @@ namespace Newtonsoft.Json private Task WriteValueInternalAsync(JsonToken token, string value, CancellationToken cancellationToken) { Task task = InternalWriteValueAsync(token, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return _writer.WriteAsync(value, cancellationToken); } @@ -266,7 +266,7 @@ namespace Newtonsoft.Json private Task WriteIntegerValueAsync(ulong uvalue, bool negative, CancellationToken cancellationToken) { Task task = InternalWriteValueAsync(JsonToken.Integer, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return WriteDigitsAsync(uvalue, negative, cancellationToken); } @@ -317,13 +317,13 @@ namespace Newtonsoft.Json internal Task DoWritePropertyNameAsync(string name, CancellationToken cancellationToken) { Task task = InternalWritePropertyNameAsync(name, cancellationToken); - if (task.Status != TaskStatus.RanToCompletion) + if (!task.IsCompletedSucessfully()) { return DoWritePropertyNameAsync(task, name, cancellationToken); } task = WriteEscapedStringAsync(name, _quoteName, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return _writer.WriteAsync(':', cancellationToken); } @@ -395,7 +395,7 @@ namespace Newtonsoft.Json internal Task DoWriteStartArrayAsync(CancellationToken cancellationToken) { Task task = InternalWriteStartAsync(JsonToken.StartArray, JsonContainerType.Array, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return _writer.WriteAsync('[', cancellationToken); } @@ -425,7 +425,7 @@ namespace Newtonsoft.Json internal Task DoWriteStartObjectAsync(CancellationToken cancellationToken) { Task task = InternalWriteStartAsync(JsonToken.StartObject, JsonContainerType.Object, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return _writer.WriteAsync('{', cancellationToken); } @@ -477,7 +477,7 @@ namespace Newtonsoft.Json internal Task DoWriteUndefinedAsync(CancellationToken cancellationToken) { Task task = InternalWriteValueAsync(JsonToken.Undefined, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return _writer.WriteAsync(JsonConvert.Undefined, cancellationToken); } @@ -1054,7 +1054,7 @@ namespace Newtonsoft.Json internal Task DoWriteValueAsync(string value, CancellationToken cancellationToken) { Task task = InternalWriteValueAsync(JsonToken.String, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return value == null ? _writer.WriteAsync(JsonConvert.Null, cancellationToken) : WriteEscapedStringAsync(value, true, cancellationToken); } @@ -1189,7 +1189,7 @@ namespace Newtonsoft.Json internal Task WriteValueNotNullAsync(Uri value, CancellationToken cancellationToken) { Task task = InternalWriteValueAsync(JsonToken.String, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return WriteEscapedStringAsync(value.OriginalString, true, cancellationToken); } @@ -1310,7 +1310,7 @@ namespace Newtonsoft.Json { UpdateScopeWithFinishedValue(); Task task = AutoCompleteAsync(JsonToken.Undefined, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return WriteRawAsync(json, cancellationToken); } diff --git a/Src/Newtonsoft.Json/JsonWriter.Async.cs b/Src/Newtonsoft.Json/JsonWriter.Async.cs index 6abd5d5a..2f93e68a 100644 --- a/Src/Newtonsoft.Json/JsonWriter.Async.cs +++ b/Src/Newtonsoft.Json/JsonWriter.Async.cs @@ -291,7 +291,7 @@ namespace Newtonsoft.Json if (_currentState == State.Property) { t = WriteNullAsync(cancellationToken); - if (t.Status != TaskStatus.RanToCompletion) + if (!t.IsCompletedSucessfully()) { return AwaitProperty(t, levelsToComplete, token, type, cancellationToken); } @@ -302,7 +302,7 @@ namespace Newtonsoft.Json if (_currentState != State.ObjectStart && _currentState != State.ArrayStart) { t = WriteIndentAsync(cancellationToken); - if (t.Status != TaskStatus.RanToCompletion) + if (!t.IsCompletedSucessfully()) { return AwaitIndent(t, levelsToComplete, token, type, cancellationToken); } @@ -310,7 +310,7 @@ namespace Newtonsoft.Json } t = WriteEndAsync(token, cancellationToken); - if (t.Status != TaskStatus.RanToCompletion) + if (!t.IsCompletedSucessfully()) { return AwaitEnd(t, levelsToComplete, type, cancellationToken); } diff --git a/Src/Newtonsoft.Json/Linq/JObject.Async.cs b/Src/Newtonsoft.Json/Linq/JObject.Async.cs index 57c50497..39f6493a 100644 --- a/Src/Newtonsoft.Json/Linq/JObject.Async.cs +++ b/Src/Newtonsoft.Json/Linq/JObject.Async.cs @@ -45,7 +45,7 @@ namespace Newtonsoft.Json.Linq public override Task WriteToAsync(JsonWriter writer, CancellationToken cancellationToken, params JsonConverter[] converters) { var t = writer.WriteStartObjectAsync(cancellationToken); - if (t.Status != TaskStatus.RanToCompletion) + if (!t.IsCompletedSucessfully()) { return AwaitStartObject(t, writer, cancellationToken, converters); } @@ -53,7 +53,7 @@ namespace Newtonsoft.Json.Linq for (int i = 0; i < _properties.Count; i++) { t = _properties[i].WriteToAsync(writer, cancellationToken, converters); - if (t.Status != TaskStatus.RanToCompletion) + if (!t.IsCompletedSucessfully()) { return AwaitProperties(t, i + 1, writer, cancellationToken, converters); } @@ -61,7 +61,7 @@ namespace Newtonsoft.Json.Linq t = writer.WriteEndObjectAsync(cancellationToken); - return (t.Status == TaskStatus.RanToCompletion) ? AsyncUtils.CompletedTask : AwaitEndObject(t); + return (t.IsCompletedSucessfully()) ? AsyncUtils.CompletedTask : AwaitEndObject(t); // Local functions, params renamed (capitalized) so as not to capture and allocate when calling async async Task AwaitStartObject(Task task, JsonWriter Writer, CancellationToken CancellationToken, JsonConverter[] Converters) diff --git a/Src/Newtonsoft.Json/Linq/JProperty.Async.cs b/Src/Newtonsoft.Json/Linq/JProperty.Async.cs index 083e228d..bd5cfb7d 100644 --- a/Src/Newtonsoft.Json/Linq/JProperty.Async.cs +++ b/Src/Newtonsoft.Json/Linq/JProperty.Async.cs @@ -44,7 +44,7 @@ namespace Newtonsoft.Json.Linq public override Task WriteToAsync(JsonWriter writer, CancellationToken cancellationToken, params JsonConverter[] converters) { Task task = writer.WritePropertyNameAsync(_name, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return WriteValueAsync(writer, cancellationToken, converters); } diff --git a/Src/Newtonsoft.Json/Utilities/AsyncUtils.cs b/Src/Newtonsoft.Json/Utilities/AsyncUtils.cs index c5d2be0b..c0a7a90e 100644 --- a/Src/Newtonsoft.Json/Utilities/AsyncUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/AsyncUtils.cs @@ -92,6 +92,16 @@ namespace Newtonsoft.Json.Utilities Debug.Assert(reader != null); return cancellationToken.IsCancellationRequested ? FromCanceled(cancellationToken) : reader.ReadAsync(buffer, index, count); } + + public static bool IsCompletedSucessfully(this Task task) + { + // IsCompletedSucessfully is the faster method, but only currently exposed on .NET Core 2.0 +#if NETCOREAPP2_0 + return task.IsCompletedSucessfully; +#else + return task.Status == TaskStatus.RanToCompletion; +#endif + } } } diff --git a/Src/Newtonsoft.Json/Utilities/JavaScriptUtils.cs b/Src/Newtonsoft.Json/Utilities/JavaScriptUtils.cs index 32cf9d84..95970307 100644 --- a/Src/Newtonsoft.Json/Utilities/JavaScriptUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/JavaScriptUtils.cs @@ -381,7 +381,7 @@ namespace Newtonsoft.Json.Utilities bool[] charEscapeFlags, StringEscapeHandling stringEscapeHandling, JsonTextWriter client, char[] writeBuffer, CancellationToken cancellationToken) { Task task = writer.WriteAsync(delimiter, cancellationToken); - if (task.Status != TaskStatus.RanToCompletion) + if (!task.IsCompletedSucessfully()) { return WriteEscapedJavaScriptStringWithDelimitersAsync(task, writer, s, delimiter, charEscapeFlags, stringEscapeHandling, client, writeBuffer, cancellationToken); } @@ -389,7 +389,7 @@ namespace Newtonsoft.Json.Utilities if (!string.IsNullOrEmpty(s)) { task = WriteEscapedJavaScriptStringWithoutDelimitersAsync(writer, s, charEscapeFlags, stringEscapeHandling, client, writeBuffer, cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + if (task.IsCompletedSucessfully()) { return writer.WriteAsync(delimiter, cancellationToken); }