Redpoint.ProgressMonitor
2023.1176.407
Prefix Reserved
dotnet add package Redpoint.ProgressMonitor --version 2023.1176.407
NuGet\Install-Package Redpoint.ProgressMonitor -Version 2023.1176.407
<PackageReference Include="Redpoint.ProgressMonitor" Version="2023.1176.407" />
paket add Redpoint.ProgressMonitor --version 2023.1176.407
#r "nuget: Redpoint.ProgressMonitor, 2023.1176.407"
// Install Redpoint.ProgressMonitor as a Cake Addin #addin nuget:?package=Redpoint.ProgressMonitor&version=2023.1176.407 // Install Redpoint.ProgressMonitor as a Cake Tool #tool nuget:?package=Redpoint.ProgressMonitor&version=2023.1176.407
Redpoint.ProgressMonitor
This library provides APIs for monitoring and reporting the progress of arbitrary operations in console applications.
Read on for the following examples:
Example for a generic stream
You can monitor an operation that uses a stream like so:
// Inject these services.
IProgressFactory _progressFactory;
IMonitorFactory _monitorFactory;
using (var stream = new FileStream(...))
{
// Start monitoring.
var cts = new CancellationTokenSource();
var progress = _progressFactory.CreateProgressForStream(stream);
var monitorTask = Task.Run(async () =>
{
var monitor = _monitorFactory.CreateByteBasedMonitor();
await monitor.MonitorAsync(
progress,
SystemConsole.ConsoleInformation,
SystemConsole.WriteProgressToConsole,
cts.Token);
});
// e.g. hash the stream.
byte[] hashBytes;
using (var hasher = SHA256.Create())
{
hashBytes = await hasher.ComputeHashAsync(stream);
}
// Stop monitoring.
await SystemConsole.CancelAndWaitForConsoleMonitoringTaskAsync(monitorTask, cts);
}
Example for a HTTP download
If you're reporting progress on a HTTP stream, there's a few extra things to keep in mind:
- You need to pass
HttpCompletionOption.ResponseHeadersRead
as the completion option, orHttpClient
will buffer the entire response by default. - You need to wrap the stream you read from in
PositionAwareStream
, which is a class provided by this library. Since the underlying HTTP stream does not supportPosition
orLength
, this wrapping stream tracks the position as the stream is read from and allows the length to be passed in as a constructor parameter (which you should set based on the Content-Length header).
Below is a concise example of how to show the progress of downloading a file:
using (var client = new HttpClient())
{
using (var target = new FileStream(targetPath, FileMode.Create, FileAccess.Write, FileShare.None))
{
var response = await client.GetAsync(downloadUrl, HttpCompletionOption.ResponseHeadersRead);
using (var stream = new PositionAwareStream(
await response.Content.ReadAsStreamAsync(),
response.Content.Headers.ContentLength!.Value))
{
var cts = new CancellationTokenSource();
var progress = _progressFactory.CreateProgressForStream(stream);
var monitorTask = Task.Run(async () =>
{
var monitor = _monitorFactory.CreateByteBasedMonitor();
await monitor.MonitorAsync(
progress,
SystemConsole.ConsoleInformation,
SystemConsole.WriteProgressToConsole,
cts.Token);
});
await stream.CopyToAsync(target);
await SystemConsole.CancelAndWaitForConsoleMonitoringTaskAsync(monitorTask, cts);
}
}
}
The SystemConsole static class
The SystemConsole
type provides common values for monitoring parameters, such as the current console information and rendering progress information to the console. You should replace the static values in the examples above with your own callbacks and values if you're not rendering progress to the console.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Framework | net48 is compatible. net481 was computed. |
-
.NETFramework 4.8
-
net7.0
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2023.1176.407 | 170 | 6/25/2023 |
2023.1176.396 | 141 | 6/25/2023 |
2023.1176.363 | 153 | 6/25/2023 |
2023.1176.360 | 186 | 6/25/2023 |
2023.1175.638 | 147 | 6/24/2023 |
2023.1170.907 | 141 | 6/19/2023 |
2023.1170.900 | 147 | 6/19/2023 |
2023.1167.562 | 142 | 6/16/2023 |
2023.1167.556 | 144 | 6/16/2023 |
2023.1167.496 | 155 | 6/16/2023 |
2023.1166.1008 | 160 | 6/15/2023 |
2023.1166.938 | 133 | 6/15/2023 |
2023.1166.713 | 154 | 6/15/2023 |
2023.1166.699 | 141 | 6/15/2023 |
2023.1165.1065 | 149 | 6/14/2023 |
2023.1165.888 | 148 | 6/14/2023 |
2023.1165.878 | 150 | 6/14/2023 |
2023.1165.861 | 137 | 6/14/2023 |
2023.1165.828 | 151 | 6/14/2023 |
2023.1165.686 | 164 | 6/14/2023 |
2023.1165.653 | 144 | 6/14/2023 |
2023.377.1003 | 226 | 5/31/2023 |
2023.377.909 | 163 | 5/31/2023 |
2023.377.558 | 163 | 5/31/2023 |
2023.365.1417 | 211 | 5/30/2023 |
2023.365.1350 | 148 | 5/30/2023 |
2023.365.1327 | 145 | 5/30/2023 |
2023.365.1306 | 161 | 5/30/2023 |
2023.365.1198 | 173 | 5/30/2023 |
2023.365.1046 | 150 | 5/30/2023 |
2023.365.710 | 149 | 5/30/2023 |
2023.365.703 | 161 | 5/30/2023 |
2023.365.336 | 151 | 5/30/2023 |
2023.174.636 | 151 | 6/14/2023 |
2023.174.616 | 133 | 6/14/2023 |
2023.174.442 | 143 | 6/14/2023 |
2023.162.1243 | 137 | 6/13/2023 |
2023.162.1225 | 144 | 6/13/2023 |
2023.162.1023 | 133 | 6/13/2023 |
2023.162.948 | 136 | 6/13/2023 |
2023.162.865 | 145 | 6/13/2023 |
2023.162.770 | 166 | 6/13/2023 |
2023.162.734 | 161 | 6/13/2023 |
2023.162.701 | 150 | 6/13/2023 |
2023.162.470 | 163 | 6/13/2023 |
2023.162.418 | 145 | 6/13/2023 |
2023.150.1142 | 146 | 6/12/2023 |
2023.150.1121 | 148 | 6/12/2023 |
2023.150.1095 | 144 | 6/12/2023 |
2023.150.1081 | 133 | 6/12/2023 |
2023.150.1066 | 144 | 6/12/2023 |
2023.150.999 | 133 | 6/12/2023 |
2023.150.916 | 162 | 6/12/2023 |
2023.150.865 | 146 | 6/12/2023 |
2023.150.831 | 146 | 6/12/2023 |
2023.150.774 | 142 | 6/12/2023 |
2023.150.613 | 139 | 6/12/2023 |
2023.150.558 | 155 | 6/12/2023 |
2023.150.456 | 169 | 6/12/2023 |
2023.150.450 | 170 | 6/12/2023 |
2023.150.220 | 166 | 6/12/2023 |
2023.150.179 | 173 | 6/12/2023 |
2023.150.167 | 166 | 6/12/2023 |
2023.138.864 | 159 | 6/11/2023 |
2023.138.837 | 154 | 6/11/2023 |
2023.138.363 | 164 | 6/11/2023 |
2023.138.224 | 189 | 6/11/2023 |
2023.138.213 | 138 | 6/11/2023 |
2023.126.1167 | 167 | 6/11/2023 |
2023.126.1148 | 159 | 6/10/2023 |
2023.126.838 | 170 | 6/10/2023 |
2023.126.794 | 165 | 6/10/2023 |
2023.126.745 | 167 | 6/10/2023 |
2023.126.714 | 177 | 6/10/2023 |
2023.126.662 | 174 | 6/10/2023 |
2023.114.544 | 148 | 6/9/2023 |
2023.114.351 | 160 | 6/9/2023 |
2023.90.1030 | 165 | 6/7/2023 |
2023.90.1009 | 148 | 6/7/2023 |
2023.54.1152 | 147 | 6/4/2023 |
2023.54.419 | 163 | 6/4/2023 |
2023.54.198 | 148 | 6/4/2023 |
2023.54.60 | 128 | 6/4/2023 |
2023.54.48 | 157 | 6/4/2023 |
2023.42.745 | 149 | 6/3/2023 |
2023.30.1191 | 143 | 6/2/2023 |
2023.30.1172 | 163 | 6/2/2023 |
2023.30.1163 | 150 | 6/2/2023 |
2023.30.1147 | 159 | 6/2/2023 |
2023.30.1136 | 169 | 6/2/2023 |
2023.30.765 | 170 | 6/2/2023 |
2023.30.761 | 156 | 6/2/2023 |
2023.30.747 | 173 | 6/2/2023 |
2023.30.734 | 144 | 6/2/2023 |