EventHandler,Task为返回值

Moe*_*ald 1 c#

基础C#EventHandler定义为:

namespace System
{
    public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
}
Run Code Online (Sandbox Code Playgroud)

有没有人,如果有一个等待的事件处理程序可用?例如

public delegate Task EventHandlerAsnyc<TEventArgs>(object sender, TEventArgs e);
Run Code Online (Sandbox Code Playgroud)

谢谢

Ren*_*ogt 6

如果您希望处理事件async(意味着您可以使用await早期返回并稍后恢复),则只需将处理程序声明为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方式SomeAsyncOrLongRunningOnAnotherThreadTask()不会阻止您的UI线程.并且在该任务完成后恢复处理程序.


旁注:通常async方法应始终返回一个TaskTask<T>可由await调用者编辑或以其他方式处理的方法.上面的用例是(afaik)唯一合理的情况,void应该用于async方法.