|
|
|
@ -42,37 +42,45 @@ namespace Perspex.Win32.Threading |
|
|
|
{ |
|
|
|
while (!cancellationToken.IsCancellationRequested) |
|
|
|
{ |
|
|
|
Job job = null; |
|
|
|
RunJobs(); |
|
|
|
|
|
|
|
while (job != null || this.queue.Count > 0) |
|
|
|
{ |
|
|
|
if (job == null) |
|
|
|
{ |
|
|
|
lock (this.queue) |
|
|
|
{ |
|
|
|
job = this.queue.Dequeue(); |
|
|
|
} |
|
|
|
} |
|
|
|
platform.ProcessMessage(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (job.Priority < DispatcherPriority.Input && platform.HasMessages()) |
|
|
|
{ |
|
|
|
break; |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// Runs continuations pushed on the loop.
|
|
|
|
/// </summary>
|
|
|
|
public void RunJobs() |
|
|
|
{ |
|
|
|
Job job = null; |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
job.Action(); |
|
|
|
job.TaskCompletionSource.SetResult(null); |
|
|
|
} |
|
|
|
catch (Exception e) |
|
|
|
while (job != null || this.queue.Count > 0) |
|
|
|
{ |
|
|
|
if (job == null) |
|
|
|
{ |
|
|
|
lock (this.queue) |
|
|
|
{ |
|
|
|
job.TaskCompletionSource.SetException(e); |
|
|
|
job = this.queue.Dequeue(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
job = null; |
|
|
|
if (job.Priority < DispatcherPriority.Input && platform.HasMessages()) |
|
|
|
{ |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
platform.ProcessMessage(); |
|
|
|
try |
|
|
|
{ |
|
|
|
job.Action(); |
|
|
|
job.TaskCompletionSource.SetResult(null); |
|
|
|
} |
|
|
|
catch (Exception e) |
|
|
|
{ |
|
|
|
job.TaskCompletionSource.SetException(e); |
|
|
|
} |
|
|
|
|
|
|
|
job = null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|