Winforms 异步委托 - VSTHRD101 或 VSTHRD110?

问题描述 投票:0回答:1

我正在尝试在 winforms 应用程序中使用异步委托,但还没有找到避免 VSTHRD 警告的方法,我想知道:

a) 有没有办法完全避免它们?或者 b)哪个是“较小的邪恶”,或者 c)如果我接受一个警告而不是另一个警告,异常处理是否仍然存在问题?

我的代码首先看起来如下:

this.Load += async (sender, e) =>
{
...
    await AsyncMethod();
...
}

当然,这会给出 VSTHRD101 警告: VSTHRD101 避免不支持的异步委托

我遵循了https://github.com/Microsoft/vs-threading/issues/447https://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 观察异步调用的结果

我怀疑我一定在这里遗漏了什么!欢迎任何意见!

c# winforms async-await
1个回答
0
投票

在 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(); 
    ...
    });
};
© www.soinside.com 2019 - 2024. All rights reserved.