private async Task <Pop3> Connect(UserInfo userInfo) { var timeout = _settings.ConnectionTimeOutMilliseconds; Task timeoutTask = Task.Delay(timeout); var connectionTask = Task.Run(() => { Pop3 pop3 = _pop3Factory.GetInstance(); if (userInfo.EncryptionType == Model.Enum.EncryptionType.Unencrypted) { pop3.Connect(userInfo.Server, userInfo.Port); } else if (userInfo.EncryptionType == Model.Enum.EncryptionType.SslTls) { pop3.ConnectSSL(userInfo.Server, userInfo.Port); } else { pop3.Connect(userInfo.Server, userInfo.Port); pop3.StartTLS(); } pop3.UseBestLogin(userInfo.UserName, userInfo.Password); return(pop3); }); var completedTask = await Task.WhenAny(connectionTask, timeoutTask); if (completedTask == connectionTask) { return(await connectionTask); } else { throw new TimeoutException("Connection with the server timed out"); } }