Browse Source

Added RunJobs to Dispatcher (needed for designer)

pull/94/head
Nikita Tsukanov 11 years ago
parent
commit
e2198a0c67
  1. 8
      src/Perspex.Base/Threading/Dispatcher.cs
  2. 54
      src/Perspex.Base/Threading/MainLoop.cs

8
src/Perspex.Base/Threading/Dispatcher.cs

@ -50,6 +50,14 @@ namespace Perspex.Threading
this.mainLoop.Run(cancellationToken);
}
/// <summary>
/// Runs continuations pushed on the loop.
/// </summary>
public void RunJobs()
{
this.mainLoop.RunJobs();
}
/// <summary>
/// Invokes a method on the dispatcher thread.
/// </summary>

54
src/Perspex.Base/Threading/MainLoop.cs

@ -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;
}
}

Loading…
Cancel
Save