diff --git a/Knoema.Client/Client.cs b/Knoema.Client/Client.cs index 2e14c41..f47948f 100644 --- a/Knoema.Client/Client.cs +++ b/Knoema.Client/Client.cs @@ -126,7 +126,7 @@ private async Task ApiGet(string path, Dictionary paramete var request = new HttpRequestMessage(HttpMethod.Get, uri); var response = await ProcessRequest(request); EnsureSuccessApiCall(response); - var responseContent = await response.Content.ReadAsStringAsync(); + var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); return JsonConvert.DeserializeObject(responseContent); } @@ -139,7 +139,7 @@ private async Task ApiPost(string path, HttpContent content) }; var response = await ProcessRequest(request); EnsureSuccessApiCall(response); - var responseContent = await response.Content.ReadAsStringAsync(); + var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); return JsonConvert.DeserializeObject(responseContent); } @@ -321,7 +321,7 @@ public async Task UploadDataset(string filename, string datasetNam var result = UploadSubmit(upload).Result; while (UploadStatus(result.Id).Result.Status == "in progress") - await Task.Delay(5000); + await Task.Delay(5000).ConfigureAwait(false); return await UploadStatus(result.Id); } @@ -376,7 +376,7 @@ public async Task SearchTimeseries(Request request, string lang = null var sendAsyncResp = await ProcessRequest(message); sendAsyncResp.EnsureSuccessStatusCode(); - var strRead = await sendAsyncResp.Content.ReadAsStringAsync(); + var strRead = await sendAsyncResp.Content.ReadAsStringAsync().ConfigureAwait(false); var result = JsonConvert.DeserializeObject(strRead); foreach (var datasetItem in result.Items) foreach (var series in datasetItem.Items) @@ -411,7 +411,7 @@ public async Task Search(string searchText, SearchScop var sendAsyncResp = await ProcessRequest(message); sendAsyncResp.EnsureSuccessStatusCode(); - var strRead = await sendAsyncResp.Content.ReadAsStringAsync(); + var strRead = await sendAsyncResp.Content.ReadAsStringAsync().ConfigureAwait(false); return JsonConvert.DeserializeObject(strRead); } @@ -458,7 +458,7 @@ public async Task WaitTaskResult(TaskResponse taskResponse, int spinDelayI i++; if (i >= maxWaitCount) throw new Exception("Maximum wait count reached"); - await Task.Delay(TimeSpan.FromSeconds(spinDelayInSeconds)); + await Task.Delay(TimeSpan.FromSeconds(spinDelayInSeconds)).ConfigureAwait(false); } if (taskResult.Status == Meta.TaskStatus.Cancelled) @@ -513,9 +513,9 @@ private Task[] GetFilesAfterUnload(string[] files, Stream[] resultStreams) Stream dataStream = null; try { - response = t.GetAwaiter().GetResult(); + response = t.ConfigureAwait(false).GetAwaiter().GetResult(); content = response.Content; - dataStream = content.ReadAsStreamAsync().GetAwaiter().GetResult(); + dataStream = content.ReadAsStreamAsync().ConfigureAwait(false).GetAwaiter().GetResult(); return dataStream.CopyToAsync(output, 4096 * 16, cts.Token).ContinueWith(_ => { dataStream.Dispose(); @@ -659,7 +659,7 @@ public async Task CreateReplacement(string originalDatasetId, string replacement var response = await ProcessRequest(message); response.EnsureSuccessStatusCode(); - var responseContent = await response.Content.ReadAsStringAsync(); + var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); if (!string.IsNullOrEmpty(responseContent)) { var resultStatus = new ResultStatusViewModel(); diff --git a/Knoema.Client/ClientExtension.cs b/Knoema.Client/ClientExtension.cs new file mode 100644 index 0000000..1a373e3 --- /dev/null +++ b/Knoema.Client/ClientExtension.cs @@ -0,0 +1,37 @@ +using Knoema.Data; + +using System.Collections.Generic; + +namespace Knoema +{ +#if NETCOREAPP3_1_OR_GREATER + public static class ClientExtension + { + public static async IAsyncEnumerable GetDataAsync(this Client client, PivotRequest pivot) + { + var response = await client.GetDataBegin(pivot); + foreach (var item in response.Data) + yield return item; + while (!string.IsNullOrEmpty(response.ContinuationToken)) + { + response = await client.GetDataStreaming(response.ContinuationToken); + foreach (var item in response.Data) + yield return item; + } + } + + public static async IAsyncEnumerable GetFlatDataAsync(this Client client, PivotRequest pivot) + { + var response = await client.GetFlatDataBegin(pivot); + foreach (var item in response.Data) + yield return item; + while (!string.IsNullOrEmpty(response.ContinuationToken)) + { + response = await client.GetFlatDataStreaming(response.ContinuationToken); + foreach (var item in response.Data) + yield return item; + } + } + } +#endif +} diff --git a/Knoema.Client/Knoema.Client.csproj b/Knoema.Client/Knoema.Client.csproj index bccda7e..a3325cf 100644 --- a/Knoema.Client/Knoema.Client.csproj +++ b/Knoema.Client/Knoema.Client.csproj @@ -1,25 +1,13 @@  - netstandard2.0;net45;netcoreapp2.0 + netstandard2.0;net45;netcoreapp2.0;netcoreapp3.1 false 1.0.0.0 true 1.0.0 - - NETSTANDARD2_0 - - - - NETCORE - - - - NET45 - - diff --git a/Knoema.Client/Knoema.Client.sln b/Knoema.Client/Knoema.Client.sln index 9653475..04f0777 100644 --- a/Knoema.Client/Knoema.Client.sln +++ b/Knoema.Client/Knoema.Client.sln @@ -1,12 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28010.2046 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31112.23 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Knoema.Client", "Knoema.Client.csproj", "{2267DC41-0A9D-48BC-AC78-79BB4472544B}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Knoema.UnitTests", "..\Knoem.Client.UnitTests\Knoema.UnitTests.csproj", "{41EF4128-CFDD-4924-AA83-39C098BAF952}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Knoema.UnitTestsNetCore31", "..\Knoema.UnitTestsNetCore31\Knoema.UnitTestsNetCore31.csproj", "{61FD8A1F-004A-4B4C-9BD1-29E8AC6EA16E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {41EF4128-CFDD-4924-AA83-39C098BAF952}.Debug|Any CPU.Build.0 = Debug|Any CPU {41EF4128-CFDD-4924-AA83-39C098BAF952}.Release|Any CPU.ActiveCfg = Release|Any CPU {41EF4128-CFDD-4924-AA83-39C098BAF952}.Release|Any CPU.Build.0 = Release|Any CPU + {61FD8A1F-004A-4B4C-9BD1-29E8AC6EA16E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61FD8A1F-004A-4B4C-9BD1-29E8AC6EA16E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61FD8A1F-004A-4B4C-9BD1-29E8AC6EA16E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61FD8A1F-004A-4B4C-9BD1-29E8AC6EA16E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Knoema.UnitTestsNetCore31/Knoema.UnitTestsNetCore31.csproj b/Knoema.UnitTestsNetCore31/Knoema.UnitTestsNetCore31.csproj new file mode 100644 index 0000000..40da0a2 --- /dev/null +++ b/Knoema.UnitTestsNetCore31/Knoema.UnitTestsNetCore31.csproj @@ -0,0 +1,28 @@ + + + + netcoreapp3.1 + + false + + Knoema.UnitTestsNetCore31 + + Knoema.UnitTestsNetCore31 + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/Knoema.UnitTestsNetCore31/KnoemaClientTests.cs b/Knoema.UnitTestsNetCore31/KnoemaClientTests.cs new file mode 100644 index 0000000..18b2ab8 --- /dev/null +++ b/Knoema.UnitTestsNetCore31/KnoemaClientTests.cs @@ -0,0 +1,52 @@ +using Knoema.Data; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Knoema.UnitTestsNetCore31 +{ + [TestClass] + public class KnoemaClientTests + { + [TestMethod] + public async Task GetDataStreamingAsync() + { + var instance = new Client("knoema.com"); + var request = new PivotRequest + { + Dataset = "WBWDI2019Jan", + Header = new List + { + new PivotRequestItem + { + DimensionId = "Time", + UiMode = "AllData" + } + }, + Stub = new List + { + new PivotRequestItem + { + DimensionId = "country", + Members = Enumerable.Range(0, 100).Select(i => 1000000 + i * 10).Cast().ToArray() + }, + new PivotRequestItem + { + DimensionId = "series", + Members = Enumerable.Range(0, 100).Select(i => 1000000 + i * 10).Cast().ToArray() + } + }, + Frequencies = new List { "A" }, + DetailColumns = new[] { "*" } + }; + + var result = await instance.GetDataAsync(request).ToListAsync(); + + Console.WriteLine(result.Count); + } + } +}