我正在尝试在 winforms 应用程序中使用异步委托,但还没有找到避免 VSTHRD 警告的方法,我想知道:
a) 有没有办法完全避免它们?或者 b)哪个是“较小的邪恶”,或者 c)如果我接受一个警告而不是另一个警告,异常处理是否仍然存在问题?
我的代码首先看起来如下:
this.Load += async (sender, e) =>
{
...
await AsyncMethod();
...
}
当然,这会给出 VSTHRD101 警告: VSTHRD101 避免不支持的异步委托
我遵循了https://github.com/Microsoft/vs-threading/issues/447和https://github.com/microsoft/vs-threading/blob/main/doc/analyzers/中给出的模式VSTHRD101.md:
var factory = joinableTaskContext.Factory;
this.Load += (sender, e) => factory.RunAsync( async () =>
{
...
await AsyncMethod();
...
}
...我现在得到 VSTHRD110,因为 RunAsync 现在正在丢弃从 RunAsync 返回的任务:
VSTHRD110 观察异步调用的结果
我怀疑我一定在这里遗漏了什么!欢迎任何意见!
在 VSTHRD100 的文档底部,它建议:
当使用方法组语法作为参数时,您可以使用所需的签名定义方法,不使用 async 修饰符,并在方法中定义匿名委托或 lambda
private void HandleEvent(object sender, EventArgs e)
{
_ = joinableTaskFactory.RunAsync(async () =>
{
// async code
});
}
注意使用
_
来丢弃返回值(在本例中为 JoinableTask
)。如果你真的想使用匿名方法,你大概可以这样做:
var factory = joinableTaskContext.Factory;
this.Load += (sender, e) => { _ = factory.RunAsync( async () =>
{
...
await AsyncMethod();
...
});
};