public void OpenInternal()
{
try
{
//dispose any old cancel tokens
if(_userCancelTokenSource != null)
_userCancelTokenSource.Dispose();
if(_openCancellationTokenSource != null)
_openCancellationTokenSource.Dispose();
//setup cancel support by user
_userCancelTokenSource = new CancellationTokenSource();
//add timout cancellation if required
if(ConnectionTimeout > 0)
{
var timeoutSource = new CancellationTokenSource(TimeSpan.FromSeconds(ConnectionTimeout));
_openCancellationTokenSource =
CancellationTokenSource.CreateLinkedTokenSource(_userCancelTokenSource.Token,
timeoutSource.Token);
}
else
_openCancellationTokenSource = _userCancelTokenSource;
//call open synchronously
Scheduler.RunSynchronously(() => OpenAsyncInternal(_openCancellationTokenSource.Token));
}
catch(OperationCanceledException ocex)
{
//check if user abort or timout
if(_openCancellationTokenSource != null && ocex.CancellationToken == _openCancellationTokenSource.Token)
{
//check if user abort
if(_userCancelTokenSource != null && _userCancelTokenSource.IsCancellationRequested)
throw new CqlException("CqlConnection Open has been aborted by user");
//timout
throw new TimeoutException("CqlConnection.Open timed out.");
}
//some other cancellation: rethrow
throw;
}
}