2016-12-02 69 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表示。