
Console
Console component, generally used for the output of background tasks
Basic usage
Display background push messages
Demo
Monitor
@using System.Collections.Concurrent
@implements IDisposable
<Console Items="@Messages" Height="126" IsAutoScroll="false" />
@code {
private ConcurrentQueue<ConsoleMessageItem> Messages { get; set; } = new();
private readonly AutoResetEvent _locker = new(true);
private CancellationTokenSource? CancelTokenSource { get; set; }
/// <summary>
/// OnAfterRender
/// </summary>
/// <param name="firstRender"></param>
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
Task.Run(async () =>
{
CancelTokenSource ??= new();
while (CancelTokenSource != null && !CancelTokenSource.IsCancellationRequested)
{
_locker.WaitOne();
Messages.Enqueue(new ConsoleMessageItem { Message = $"{DateTimeOffset.Now}: Dispatch Message" });
if (Messages.Count > 8)
{
Messages.TryDequeue(out var _);
}
await InvokeAsync(StateHasChanged);
_locker.Set();
try
{
if (CancelTokenSource != null)
{
await Task.Delay(2000, CancelTokenSource.Token);
}
}
catch { }
}
});
}
}
/// <summary>
/// Dispose
/// </summary>
/// <param name="disposing"></param>
private void Dispose(bool disposing)
{
if (disposing && CancelTokenSource != null)
{
CancelTokenSource.Cancel();
CancelTokenSource.Dispose();
CancelTokenSource = null;
}
}
/// <summary>
/// Dispose
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
messages in different colors
Changes to colors are made by setting the Color
parameter of ConsoleMessageItem
Demo
Monitor
@using System.Collections.Concurrent
@implements IDisposable
<Console Items="@ColorMessages" Height="126" />
@code {
private ConcurrentQueue<ConsoleMessageItem> ColorMessages { get; set; } = new();
private readonly AutoResetEvent _locker = new(true);
private CancellationTokenSource? CancelTokenSource { get; set; }
/// <summary>
/// OnAfterRender
/// </summary>
/// <param name="firstRender"></param>
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
Task.Run(async () =>
{
CancelTokenSource ??= new();
while (CancelTokenSource != null && !CancelTokenSource.IsCancellationRequested)
{
_locker.WaitOne();
ColorMessages.Enqueue(new ConsoleMessageItem { Message = $"{DateTimeOffset.Now}: Dispatch Message", Color = GetColor() });
if (ColorMessages.Count > 12)
{
ColorMessages.TryDequeue(out var _);
}
await InvokeAsync(StateHasChanged);
_locker.Set();
try
{
if (CancelTokenSource != null)
{
await Task.Delay(2000, CancelTokenSource.Token);
}
}
catch { }
}
});
}
}
/// <summary>
/// GetColor
/// </summary>
/// <returns></returns>
private static Color GetColor()
{
var second = DateTime.Now.Second;
return (second % 3) switch
{
1 => Color.Danger,
2 => Color.Info,
_ => Color.None
};
}
/// <summary>
/// Dispose
/// </summary>
/// <param name="disposing"></param>
private void Dispose(bool disposing)
{
if (disposing && CancelTokenSource != null)
{
CancelTokenSource.Cancel();
CancelTokenSource.Dispose();
CancelTokenSource = null;
}
}
/// <summary>
/// Dispose
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
auto scroll
Enable or disable automatic scrolling by setting the ShowAutoScroll
property value
Demo
by setting IsAutoScroll
Turn on autoscroll
Monitor
@using System.Collections.Concurrent
@implements IDisposable
<Console Items="@Messages" Height="126" IsAutoScroll="true" />
@code {
private ConcurrentQueue<ConsoleMessageItem> Messages { get; set; } = new();
private readonly AutoResetEvent _locker = new(true);
private CancellationTokenSource? CancelTokenSource { get; set; }
/// <summary>
/// OnAfterRender
/// </summary>
/// <param name="firstRender"></param>
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
Task.Run(async () =>
{
CancelTokenSource ??= new();
while (CancelTokenSource != null && !CancelTokenSource.IsCancellationRequested)
{
_locker.WaitOne();
Messages.Enqueue(new ConsoleMessageItem { Message = $"{DateTimeOffset.Now}: Dispatch Message" });
if (Messages.Count > 8)
{
Messages.TryDequeue(out var _);
}
await InvokeAsync(StateHasChanged);
_locker.Set();
try
{
if (CancelTokenSource != null)
{
await Task.Delay(2000, CancelTokenSource.Token);
}
}
catch { }
}
});
}
}
/// <summary>
/// Dispose
/// </summary>
/// <param name="disposing"></param>
private void Dispose(bool disposing)
{
if (disposing && CancelTokenSource != null)
{
CancelTokenSource.Cancel();
CancelTokenSource.Dispose();
CancelTokenSource = null;
}
}
/// <summary>
/// Dispose
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Empty console
The data set is cleared by setting the OnClear
callback method. Since this example uses the same data source as the previous example, it will cause the data source update delay in the above example
Demo
Monitor
@using System.Collections.Concurrent
@implements IDisposable
<Console Items="@Messages" Height="126" OnClear="@OnClear" />
@code {
private ConcurrentQueue<ConsoleMessageItem> Messages { get; set; } = new();
private readonly AutoResetEvent _locker = new(true);
private CancellationTokenSource? CancelTokenSource { get; set; }
/// <summary>
/// OnAfterRender
/// </summary>
/// <param name="firstRender"></param>
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
Task.Run(async () =>
{
CancelTokenSource ??= new();
while (CancelTokenSource != null && !CancelTokenSource.IsCancellationRequested)
{
_locker.WaitOne();
Messages.Enqueue(new ConsoleMessageItem { Message = $"{DateTimeOffset.Now}: Dispatch Message" });
if (Messages.Count > 8)
{
Messages.TryDequeue(out var _);
}
await InvokeAsync(StateHasChanged);
_locker.Set();
try
{
if (CancelTokenSource != null)
{
await Task.Delay(2000, CancelTokenSource.Token);
}
}
catch { }
}
});
}
}
/// <summary>
/// OnClear
/// </summary>
private void OnClear()
{
_locker.WaitOne();
while (!Messages.IsEmpty)
{
Messages.TryDequeue(out var _);
}
_locker.Set();
}
/// <summary>
/// Dispose
/// </summary>
/// <param name="disposing"></param>
private void Dispose(bool disposing)
{
if (disposing && CancelTokenSource != null)
{
CancelTokenSource.Cancel();
CancelTokenSource.Dispose();
CancelTokenSource = null;
}
}
/// <summary>
/// Dispose
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
ShowAutoScroll
Switch auto scroll the data by set ShowAutoScroll
parameter
Demo
set up ShowAutoScroll="true"
Show autoscroll options
Monitor
@using System.Collections.Concurrent
@implements IDisposable
<Console Items="@Messages" Height="126" ShowAutoScroll="true" OnClear="@OnClear" />
@code {
private ConcurrentQueue<ConsoleMessageItem> Messages { get; set; } = new();
private readonly AutoResetEvent _locker = new(true);
private CancellationTokenSource? CancelTokenSource { get; set; }
/// <summary>
/// OnAfterRender
/// </summary>
/// <param name="firstRender"></param>
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
Task.Run(async () =>
{
CancelTokenSource ??= new();
while (CancelTokenSource != null && !CancelTokenSource.IsCancellationRequested)
{
_locker.WaitOne();
Messages.Enqueue(new ConsoleMessageItem { Message = $"{DateTimeOffset.Now}: Dispatch Message" });
if (Messages.Count > 8)
{
Messages.TryDequeue(out var _);
}
await InvokeAsync(StateHasChanged);
_locker.Set();
try
{
if (CancelTokenSource != null)
{
await Task.Delay(2000, CancelTokenSource.Token);
}
}
catch { }
}
});
}
}
/// <summary>
/// OnClear
/// </summary>
private void OnClear()
{
_locker.WaitOne();
while (!Messages.IsEmpty)
{
Messages.TryDequeue(out var _);
}
_locker.Set();
}
/// <summary>
/// Dispose
/// </summary>
/// <param name="disposing"></param>
private void Dispose(bool disposing)
{
if (disposing && CancelTokenSource != null)
{
CancelTokenSource.Cancel();
CancelTokenSource.Dispose();
CancelTokenSource = null;
}
}
/// <summary>
/// Dispose
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Attributes
Loading...
ConsoleMessageItem property
Loading...
B station related video link
No
交流群