@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;
    }
}