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
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力