Skip to content

Blazor example uses async void instead of async Task. #34360

@ScarletKuro

Description

@ScarletKuro

Description

This code section

<div class="card bg-light mb-3" style="width:30rem">
    <div @onclick="Toggle" class="card-header">
        <h2 class="card-title">Toggle (<code>Expanded</code> = @expanded)</h2>
    </div>
    @if (expanded)
    {
        <div class="card-body">
            <p class="card-text">@ChildContent</p>
        </div>
    }
</div>

@code {
    [Parameter]
    public bool Expanded { get; set; }

    [Parameter]
    public EventCallback<bool> ExpandedChanged { get; set; }

    [Parameter]
    public RenderFragment? ChildContent { get; set; }

    private bool expanded;

    protected override void OnParametersSet() => expanded = Expanded;

    private async void Toggle()
    {
        expanded = !expanded;
        await ExpandedChanged.InvokeAsync(expanded);
    }
}

Uses async void Toggle instead of async Task Toggle, even though the @onclick="Toggle" event handler supports Task methods as well.

This is considered a code smell, and we should avoid providing bad examples, as async void should generally be avoided in most cases.

Therefore, it should be replaced with private async Task Toggle() or private async Task ToggleAsync().

Page URL

https://learn.microsoft.com/en-us/aspnet/core/blazor/components/overwriting-parameters?view=aspnetcore-9.0

Content source URL

https://github.com/dotnet/AspNetCore.Docs/blob/main/aspnetcore/blazor/components/overwriting-parameters.md

Document ID

e687c953-409d-49b9-664a-19ca1f836e4b

Article author

@guardrex

Related Issues

Metadata

Metadata

Assignees

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions