异步方法的事件订阅

时间:2015-03-13 10:30:15

标签: c# asynchronous event-handling

我想以两种方式发布LoadDataAsync。首先是FormLoad()中的订阅和经典方法ManualLoad()的事件。

但我无法使其发挥作用。

我无法订阅任务返回。使用void它可行,但void方法中的await无法ManualLoad()。如何使两种方式都有效?

    public delegate void ProductDelegate(long? iShopProductId);
    public event ProductDelegate ProductSelectionChanged = delegate { };

    public async Task LoadDataAsync(long? iProductId)
    {
        //await action....
    }

    //first way
    public void FormLoad()
    {
        this.ProductSelectionChanged += LoadDataAsync //UNDERLINED ERROR;
    }

    //second way
    public async Task ManualLoad()
    {
        await LoadDataAsync(2);
    }

1 个答案:

答案 0 :(得分:5)

由于事件不支持async Task,您需要通过" wrap"来解决这个问题。它,例如:

this.ProductSelectionChanged += async (s, e) => await LoadDataAsync();

在这里,我创建了一个匿名方法/处理程序,其签名为async void,除了await任务返回LoadDataAsync方法之外什么都不做(可能你应该添加ConfigureAwait(false) },具体取决于您的具体用例)。