@page "/"
<p>
<button style="width: 140px;"
@onclick="OnButtonClicked_Sync"
>Sync</button>
<button style="width: 140px;"
@onclick="OnButtonClicked_Async_Nominal"
>Async (nominal)</button>
<button style="width: 140px;"
@onclick="OnButtonClicked_Async_Yield"
>Async (Yield)</button>
<button style="width: 140px;"
@onclick="OnButtonClicked_Async_Delay"
>Async (Delay)</button>
</p>
<p>
Number of square mouse-move events: @NumberOfSquareMouseMoveEvents,
and click events: @NumberOfSquareClickEvents
</p>
<p>Accumulator: @Accumulator</p>
<div style="width: 150px; height: 150px; background: red;"
@onmousemove="OnSquareMouseMove"
@onclick="OnSquareClick"
></div>
@code {
public int NumberOfSquareMouseMoveEvents { get; set; } = 0;
public int NumberOfSquareClickEvents { get; set; } = 0;
public double Accumulator { get; set; } = 0.0;
public int NumberOfIterations { get; set; } = 15_000_001;
public const int NumberOfIterationsPerAwait = 1_000_000;
public const int DelayLengthInMilliseconds = 10;
public void OnSquareMouseMove()
{
++NumberOfSquareMouseMoveEvents;
}
public void OnSquareClick()
{
++NumberOfSquareClickEvents;
}
public void OnButtonClicked_Sync()
{
double d = 0.0;
for (int i = 0; i < NumberOfIterations; ++i)
{
d += Math.Sin(i);
}
Accumulator += d;
}
#pragma warning disable CS1998 // "Async" method does not use "await"
public async Task OnButtonClicked_Async_Nominal()
{
double d = 0.0;
for (int i = 0; i < NumberOfIterations; ++i)
{
d += Math.Sin(i);
}
Accumulator += d;
}
#pragma warning restore
public async Task OnButtonClicked_Async_Yield()
{
double d = 0.0;
for (int i = 0; i < NumberOfIterations; ++i)
{
if (i % NumberOfIterationsPerAwait == 0)
{
await Task.Yield();
}
d += Math.Sin(i);
}
Accumulator += d;
}
public async Task OnButtonClicked_Async_Delay()
{
double d = 0.0;
for (int i = 0; i < NumberOfIterations; ++i)
{
if (i % NumberOfIterationsPerAwait == 0)
{
await Task.Delay(DelayLengthInMilliseconds);
}
d += Math.Sin(i);
}
Accumulator += d;
}
}