Should I avoid 'async void' event handlers?

后端 未结 4 2052
-上瘾入骨i
-上瘾入骨i 2020-11-22 16:19

I know it is considered generally a bad idea to use fire-and-forget async void methods to start tasks, because there is no track of the pending task and it is t

相关标签:
4条回答
  • 2020-11-22 16:49

    The guideline is to avoid async void except when used in an event handler, so using async void in an event handler is OK.

    That said, for unit testing reasons I often like to factor out the logic of all async void methods. E.g.,

    public async Task OnFormLoadAsync(object sender, EventArgs e)
    {
      await Task.Delay(2000);
      ...
    }
    
    private async void Form_Load(object sender, EventArgs e)
    {
      await OnFormLoadAsync(sender, e);
    }
    
    0 讨论(0)
  • 2020-11-22 16:55

    Should I generally avoid async void event handlers, as well?

    Generally event handlers are the one case where a void async method is not a potential code smell.

    Now, if you do need to track the task for some reason then the technique you describe is perfectly reasonable.

    0 讨论(0)
  • 2020-11-22 17:01

    Yes, generally async void of event handlers is the only case. If you want to know more about it you can check out a great video here at channel 9

    The only case where this kind of fire-and-forget is appropriate is in top-level event-handlers. Every other async method in your code should return "async Task".

    here is the link

    0 讨论(0)
  • 2020-11-22 17:02

    If you use ReSharper, a free ReCommended Extension could be helpful for you. It analyzes the "async void" methods and highlights when used inappropriately. The extension can distinguish different usages of async void and provide appropriated quick fixes described here: ReCommended-Extension wiki.

    0 讨论(0)
提交回复
热议问题