Blazor InvokeAsync 和 await InvokeAsync功能区别

2021-11-17  乐帮网

blazor c#

有以下示例代码:

public void IncrementCounter()
{
    _counter++;
    InvokeAsync(StateHasChanged);
}

public void IncrementCounter()
{
    InvokeAsync(() => 
    {
        _counter++;
        StateHasChanged();
    }
}

public async Task IncrementCounter()
{
    _counter++;
    await InvokeAsync(StateHasChanged);
}

public async Task IncrementCounter()
{
    await InvokeAsync(() =>
    {
        _counter++;
        StateHasChanged();
    });
}

看起来效果都一样,但是它们这样使用有什么不同呢?
上述代码延变于Blazor提供的默认模板里一个按钮执行的方法,从效果上来说都是进行加1操作,并没有什么不同。但是要注意:按钮的事件执行是来自SyncContext线程的。所以可以在没有 Invoke 的情况下使用普通的 StateHasChanged()。

如果我们换成 Timer 事件。 可以看到Threading.Timer 类不支持异步处理程序,因此您可以在未指定线程上的 void Tick() { ... } 中运行。此处确实需要 InvokeAsync(StateHasChanged)。 您可以将 Tick 方法设为 async void 以等待 InvokeAsync ,但这会给出错误的信号。 在不等待的情况下使用 InvokeAsync 也没有什么问题。 

void Tick()  // 可能是线程事件处理程序 
{
   _counter++;
   InvokeAsync(StateHasChanged);  // 可以立即执行
}

但是当你在一个异步方法中并且仍然需要 InvokeAsync 时,等待它会更合理。 

async Task SomeService()  
{
   _counter++;
   await InvokeAsync(StateHasChanged); 
}

https://stackoverflow.com/questions/65881870/blazor-invokeasync-vs-await-invokeasync

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力