|
|
@ -6,6 +6,7 @@ |
|
|
// ==========================================================================
|
|
|
// ==========================================================================
|
|
|
|
|
|
|
|
|
using System; |
|
|
using System; |
|
|
|
|
|
using System.Threading; |
|
|
using System.Threading.Tasks; |
|
|
using System.Threading.Tasks; |
|
|
|
|
|
|
|
|
#pragma warning disable 4014
|
|
|
#pragma warning disable 4014
|
|
|
@ -46,7 +47,7 @@ namespace Squidex.Infrastructure |
|
|
IDisposable subscription = null; |
|
|
IDisposable subscription = null; |
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
var receiveTask = new TaskCompletionSource<TResponse>(); |
|
|
var receiveTask = new TaskCompletionSource<TResponse>(TaskCreationOptions.RunContinuationsAsynchronously); |
|
|
|
|
|
|
|
|
subscription = pubsub.Subscribe<Response<TResponse>>(response => |
|
|
subscription = pubsub.Subscribe<Response<TResponse>>(response => |
|
|
{ |
|
|
{ |
|
|
@ -58,17 +59,23 @@ namespace Squidex.Infrastructure |
|
|
|
|
|
|
|
|
Task.Run(() => pubsub.Publish(request, self)); |
|
|
Task.Run(() => pubsub.Publish(request, self)); |
|
|
|
|
|
|
|
|
var firstTask = await Task.WhenAny(receiveTask.Task, Task.Delay(timeout)); |
|
|
using (var cts = new CancellationTokenSource()) |
|
|
|
|
|
{ |
|
|
|
|
|
var delayTask = Task.Delay(timeout, cts.Token); |
|
|
|
|
|
|
|
|
if (firstTask.Id != receiveTask.Task.Id) |
|
|
var resultTask = await Task.WhenAny(receiveTask.Task, delayTask); |
|
|
|
|
|
if (resultTask == delayTask) |
|
|
{ |
|
|
{ |
|
|
throw new TaskCanceledException(); |
|
|
throw new TaskCanceledException(); |
|
|
} |
|
|
} |
|
|
else |
|
|
else |
|
|
{ |
|
|
{ |
|
|
|
|
|
cts.Cancel(); |
|
|
|
|
|
|
|
|
return await receiveTask.Task; |
|
|
return await receiveTask.Task; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
finally |
|
|
finally |
|
|
{ |
|
|
{ |
|
|
subscription?.Dispose(); |
|
|
subscription?.Dispose(); |
|
|
|