第一次异常后循环退出时尝试捕获内部

时间:2015-02-16 11:26:56

标签: c# windows-services try-catch

我有一个Windows服务,在实例化后立即运行以下Initialize()方法。

public async virtual void Initialize()
{
    bool initSuccess = false;
    int retry = 1;
    while (!initSuccess && retry <= 10)
    {
        try
        {
            schedulerFactory = CreateSchedulerFactory();
            scheduler = GetScheduler();
            initSuccess = true;
        }
        catch (Exception ex)
        {
            logger.Error(string.Format("Server initialization failed, retry #{0} of 10 / Error message: {1}", retry, ex.Message));
            retry++;
        }
        Task startTimer = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(10000);
        });
        await startTimer;
    }
}

因此,如果初始化失败,我想给服务器10更多尝试启动。调用上述函数的代码是:

QuartzServer server = new QuartzServer();
server.Initialize();
return server;

出于某种原因,这个Initialize()方法在第一次迭代后退出。这意味着我的while循环似乎没用,尽管我可以在我的日志中看到Exception被捕获。任何人都可以检测到代码逻辑有什么问题吗?

1 个答案:

答案 0 :(得分:3)

Initialize是一种async void方法,通常应该避免使用,只能用于事件处理程序。原因是这样的方法不可能等待完成,因为它不会返回Task。第一次到达await startTimer语句Initialize会将控制权返回给其调用者,因此看起来已经退出了while循环,而实际上它还没有。

相关问题