2016-12-02 67 views
0

比方說,我們有以下方法:繼續在特定的等待

public async Task HandleAsync(MessageContext context, RegisterAccount account) 
{ 
    var user = blabla; 
    await _repository.CreateAsync(user); 
    await _emailHandler.Send(new ActivationEmail(user)); 

    await _context.WaitForAsync<AccountActivated>(x=> x.AccountId == user.Id); 

    user.Activate(); 
    _repository.UpdateAsync(user); 
} 

WaitForAsync調用我發佈內部郵件服務,並因此允許其繼續處理其他消息。所以這個類實例正在等待我的自定義服務器。

這效果很好。

不過,我也堅持國家才能夠退出應用程序,然後繼續重啓進程後。如果我使用單獨的方法,這將工作得很好(只需調用continuation方法)。

但是,由於異步/等待重寫代碼,在重啓之後接收到正確的消息時,是否可以告訴.NET在「WaitForAsync」之後繼續? (即創建類,設置狀態,告訴它在WaitForAsync行後繼續,而不是從調用方法開始)

(是的,我只是有關如何異步/等待更改代碼的基本知識,因此問題)

+0

不,您應該在'await _context.WaitForAsync'之後放置該代碼。否則,您可能需要基於事件的系統而不是基於異步的系統。 – GSerg

+0

請注意,最後一行可能會缺少「await」。 – GSerg

+0

如果發生這種情況,您可以在狀態中保留一些額外的指示條件(如果它不是已經可確定的)並且'if()'出現在HandleAsync()的前幾行? – sellotape

回答

0

當重新啓動後接收到正確的消息時,是否可以告訴.NET在「WaitForAsync」之後繼續運行?

不是。最好的解決方案是按照Fabio的建議有一個傳入消息隊列,並且有一個(可能是異步的)「消費者」處理這些消息。這可以自然地用Reactive Extensions或可能的TPL Dataflow表示。