EventHandler,其中Task为返回值

时间:2017-08-10 12:38:06

标签: c#

基础C#EventHandler定义为:

namespace System
{
    public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
}

是否有人可以使用等待的事件处理程序? E.g。

public delegate Task EventHandlerAsnyc<TEventArgs>(object sender, TEventArgs e);

THX

1 个答案:

答案 0 :(得分:5)

如果您希望处理事件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;
    }
}

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

附注:通常async种方法应始终返回TaskTask<T>awaitvoid可由async或由来电者处理。上面的用例是(afaik)唯一合理的情况,Criteria1方法应该使用Criterial