C# 返回值为Task的EventHandler

C# 返回值为Task的EventHandler,c#,C#,基本C#事件处理程序定义为: namespace System { public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e); } 名称空间系统 { 公共委托void EventHandler(对象发送方,TEventArgs e); } 是否有人知道是否有可等待的事件处理程序可用?例如 public delegate Task EventHandlerAsnyc<TEven

基本C#
事件处理程序
定义为:

namespace System
{
    public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
}
名称空间系统
{
公共委托void EventHandler(对象发送方,TEventArgs e);
}
是否有人知道是否有可等待的事件处理程序可用?例如

public delegate Task EventHandlerAsnyc<TEventArgs>(object sender, TEventArgs e);
public委托任务EventHandlerAsnyc(对象发送方,TEventArgs e);

Thx

如果您希望处理事件
async
(这意味着您可以使用
wait
提前返回并稍后恢复),只需将处理程序声明为
async void

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponents();

        myButton.Click += myButton_Click;
    }

    public async void myButton_Click(object sender, EventArgs e)
    {
        myButton.Enabled = false;

        await SomeAsyncOrLongRunningOnAnotherThreadTask();

        myButton.Enabled = true;
    }
}
这样,
someasynchlorongrunningonanotherthreadtask()
就不会阻塞UI线程。处理程序将在该任务完成后恢复



旁注:通常
async
方法应该总是返回一个
Task
Task
,调用方可以
wait
ed或以其他方式处理它。上面的用例(afaik)是唯一合理的情况,其中
void
应用于
async
方法。

如果您希望事件被处理
async
(意味着您可以使用
等待
提前返回,稍后恢复),您可以简单地将处理程序声明为
async void

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponents();

        myButton.Click += myButton_Click;
    }

    public async void myButton_Click(object sender, EventArgs e)
    {
        myButton.Enabled = false;

        await SomeAsyncOrLongRunningOnAnotherThreadTask();

        myButton.Enabled = true;
    }
}
这样,
someasynchlorongrunningonanotherthreadtask()
就不会阻塞UI线程。处理程序将在该任务完成后恢复



旁注:通常
async
方法应该总是返回一个
Task
Task
,调用方可以
wait
ed或以其他方式处理它。上面的用例(afaik)是唯一合理的情况,
void
应该用于
async
方法。

没有内置到.NET中,没有,但是您可以自己添加一个,尽管这也会(应该)使
OnEventName
方法返回一个任务,并迫使您在堆栈中异步编写代码“正确执行”。我可以问你希望这个委托能为你解决什么问题吗?不,但请解释一下你需要它做什么。如果你只是想处理一个(如winforms)事件
async
,你可以将处理程序声明为
async void MyButton\u Click(object sender,EventArgs e)
。这是一种罕见的方法(如果不仅仅如此)使用
void
作为
async
方法的返回类型是可以的。@RenéVogt您的注释re
async void
事件处理程序就是答案。您甚至可以引用许多文章中的一篇来说明这一点。@RenéVogt,thx作为注释,正如NKosi回答我的问题所说的那样。您可以将注释添加为答案吗这个问题?Thx这将是一个相当可怕的设计错误。事件可以有多个订阅者,您将使用哪个返回值?它们是阻抗不匹配的,异步无效事件处理程序在与UI相关的事件中是OK的。无论如何,其中一些是OK的。不要这样做。没有内置到.NET中,没有,但您可以自己添加一个,尽管如此还会(应该)使
OnEventName
方法也返回任务,并会迫使您异步编写堆栈中的代码以“正确地完成”。我可以问您希望使用此委托能解决什么问题吗?不,但请解释您需要此方法的原因。如果您只是想要一个(例如winforms)要处理的事件
async
,您可以将处理程序声明为
async void MyButton\u Click(object sender,EventArgs e)
。这是一种罕见的(如果不是唯一的)使用
void
作为
async
方法的返回类型是可以的。@RenéVogt您的注释re
async void
事件处理程序就是答案。您甚至可以引用许多文章中的一篇来说明这一点。@RenéVogt,thx作为注释,正如NKosi回答我的问题所说的那样。您可以将注释添加为答案吗这个问题?Thx这将是一个相当可怕的设计错误。事件可以有多个订阅服务器,您将使用哪个返回值?它们是阻抗不匹配的,异步无效事件处理程序在与UI相关的事件中是正常的。无论如何,它们中的一些。不要这样做。