我有一个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
被捕获。任何人都可以检测到代码逻辑有什么问题吗?
答案 0 :(得分:3)
Initialize是一种async void
方法,通常应该避免使用,只能用于事件处理程序。原因是这样的方法不可能等待完成,因为它不会返回Task
。第一次到达await startTimer
语句Initialize
会将控制权返回给其调用者,因此看起来已经退出了while循环,而实际上它还没有。