2015-03-13 83 views
2

我想用2种方式启动LoadDataAsync。首先通过FormLoad()中的一个事件和一个经典方法ManualLoad()异步方法事件订阅

但我不能让它工作。

我无法订阅任务返回。与void它的工作原理,但void不能在ManualLoad()方法await。两种方式如何工作?

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); 
    } 
+0

可能重复的[C#中的异步事件](http://stackoverflow.com/questions/27761852/asynchronous-events-in-c-sharp) – 2017-01-27 13:35:09

回答

3

随着事件不支持async Task你neeed通过“包装”来解决它,比如:

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

在这里,我创建了一个匿名方法/处理器使用的async void签名这什么都不做否则,await任务返回LoadDataAsync -method(可能应该添加ConfigureAwait(false),具体取决于您的具体用例)。

+0

非常感谢。只是为了我的示例是完美的答案是this.ProductSelectionChanged + = async(s)=>等待LoadDataAsync(s); – Julian50 2015-03-13 11:24:36