延迟基于事件

时间:2016-06-23 16:04:31

标签: .net events delay

我有以下类在aws sns队列上发布消息" TryRestart()":

internal class SmsReceptionTestRunner : ITestRunner<ConfigurationViaSmsAttempt>
{
    private readonly CommunicationClient _communicationClient;

    public SmsReceptionTestRunner(CommunicationClient communicationClient)
    {
        _communicationClient = communicationClient;
    }

    public Test Execute(ConfigurationViaSmsAttempt MessageType)
    {
        // publish
        _communicationClient.ConfigurationService.TryRestart(MessageType.Imei);

        // wait five minutes ...    

        return new Test("6", "", false, MessageType.TargetApn, MessageType.TargetApn);
    }
}

一个单独的处理程序类在队列上发布时会处理答案 - 通常需要大约五分钟 - await Task.Delay(TimeSpan.FromMinutes(5));。 5分钟后。如果没有处理任何消息,我将新的测试集保存为false。:

public class RestartViaSmsAttemptHandler : IHandler<RestartViaSmsAttempt>
{
    private readonly IRepository<Test> _TestRepository;

    public RestartViaSmsAttemptHandler(IRepository<Test> TestRepository)
    {
        _TestRepository = TestRepository;
    }

    public bool Handle(RestartViaSmsAttempt message)
    {
        var test = new Test("6", message.Imei, true, "", "");
        _TestRepository.Save(test);
        return true;
    }
}

我想放置一种机制,以防止// wait five minutes位仅在我的处理程序从队列中收回消息时才会运行。

基本上,我要求重新启动,5分钟后,如果没有答案,我知道出了问题。

1 个答案:

答案 0 :(得分:0)

你可以像这样早点中止等待:

await Task.WhenAll(someTask, TimeSpan.FromMinutes(5));

someTask完成后,等待结束。您可以使用TaskCompletionSource生成要随意完成的任务。

因此,如果您收到回复,则完成任务并结束等待。

您确定需要消息队列吗?您基本上是通过消息队列运行同步调用。也许你需要一个普通的网络服务电话。