// Copyright © 2015 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #pragma once #include "Stdafx.h" #include "include/cef_task.h" #include "CefTaskWrapper.h" using namespace System::Threading::Tasks; using namespace System::Runtime::InteropServices; namespace CefSharp { namespace Internals { private ref class CefTaskScheduler : TaskScheduler, ITaskScheduler { public: CefThreadId _thread; CefTaskScheduler(CefThreadId thread) : _thread(thread) { }; virtual void QueueTask(Task^ task) override { CefRefPtr taskWrapper = new CefTaskWrapper(task, this); CefPostTask(_thread, taskWrapper); }; virtual void ExecuteTask(Task^ task) { TryExecuteTask(task); }; static bool CurrentlyOnThread(CefThreadId threadId) { return CefCurrentlyOn(threadId); } static void EnsureOn(CefThreadId threadId, String^ context) { if (!CefCurrentlyOn(threadId)) { throw gcnew InvalidOperationException(String::Format("Executed '{0}' on incorrect thread. This method expects to run on the CEF {1} thread!", context, ((CefThreadIds)threadId).ToString())); } } static void EnsureOn(CefThreadIds threadId, String^ context) { EnsureOn((CefThreadId)threadId, context); } protected: virtual bool TryExecuteTaskInline(Task^ task, bool taskWasPreviouslyQueued) override { // You might think this method might not get called, // but a .ContinueWith(..., TaskContinuationOpation.ExecuteSyncronously) // will probably end up calling this method, // so assume the callers know what they're doing and execute the task // inline on this thread (if the current thread is correct for this scheduler) if (CefCurrentlyOn(_thread)) { return TryExecuteTask(task); } return false; }; virtual IEnumerable^ GetScheduledTasks() override { return nullptr; }; }; } }