相关疑难解决方法(0)

我应该避免'async void'事件处理程序吗?

我知道使用fire-and-forget async void方法来启动任务通常被认为是一个坏主意,因为没有跟踪任务的跟踪,处理可能在这种方法中抛出的异常是很棘手的.

我一般应该避免使用async void事件处理程序吗?例如,

private async void Form_Load(object sender, System.EventArgs e)
{
        await Task.Delay(2000); // do async work
        // ...
} 
Run Code Online (Sandbox Code Playgroud)

我可以像这样重写它:

Task onFormLoadTask = null; // track the task, can implement cancellation

private void Form_Load(object sender, System.EventArgs e)
{
        this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);
} 

private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e)
{
        await Task.Delay(2000); // do async work
        // ...
} 
Run Code Online (Sandbox Code Playgroud)

除了可能的重入之外,异步事件处理程序的水下岩石是什么?

.net c# events asynchronous async-await

108
推荐指数
4
解决办法
4万
查看次数

是否可以将异步事件处理程序附加到System.Timers.Timer?

我已经在这里阅读了SO帖子和文章这里 我有一个计时器事件,每隔一段时间触发一次,我想在处理程序中进行一些异步处理,所以有类似的东西:

        Timer timer = new Timer();
        timer.Interval = 1000;
        timer.Elapsed += timer_Elapsed; // Please ignore this line. But some answers already given based on this line so I will leave it as it is.
        timer.Elapsed += async (sender, arguments) => await timer_Elapsed(sender, arguments);


       private async Task timer_Elapsed(object sender, ElapsedEventArgs e)
       {
          await Task.Delay(10);
       }
Run Code Online (Sandbox Code Playgroud)

上面的代码编译和工作.

但我不确定为什么代码正在编译.该ElapsedEventHandler预期的签名是

      void timer_Elapsed(object sender, ElapsedEventArgs e)
Run Code Online (Sandbox Code Playgroud)

但是我的方法返回Task而不是void因为async void不推荐.但这与ElapsedEventHandler签名不匹配,仍在编译和工作?

可以在Timer.Elapsed上调用asyn方法吗?代码将在windows服务中执行.

更新1

async …

c# timer async-await

10
推荐指数
1
解决办法
3707
查看次数

标签 统计

async-await ×2

c# ×2

.net ×1

asynchronous ×1

events ×1

timer ×1