internal static async Task <bool> PlayAdAsync(this IVpaid vpaid, CancellationToken cancellationToken) #endif { var errorTask = vpaid.GetErrorTask(cancellationToken); var stoppedTask = vpaid.GetStoppedTask(cancellationToken); var approachingEndTask = vpaid.GetApproachingEndTask(cancellationToken); var cancellationTask = cancellationToken.AsTask(); #if SILVERLIGHT && !WINDOWS_PHONE || WINDOWS_PHONE7 var completedTask = await TaskEx.WhenAny(stoppedTask, approachingEndTask, errorTask, cancellationTask); #else var completedTask = await Task.WhenAny(stoppedTask, approachingEndTask, errorTask, cancellationTask); #endif bool result = true; if (completedTask == errorTask) { throw errorTask.Result; } else if (completedTask == cancellationTask) { vpaid.StopAd(); } else if (completedTask == approachingEndTask) { result = false; } cancellationToken.ThrowIfCancellationRequested(); return(result); }