public static void ContinueTask(IntPtr task, IntPtr context, IntPtr callback, IntPtr exception) { try { Marshal.WriteIntPtr(exception, IntPtr.Zero); DebugMessage("CoreCLREmbedding::ContinueTask (CLR) - Starting"); GCHandle taskHandle = GCHandle.FromIntPtr(task); Task <Object> actualTask = (Task <Object>)taskHandle.Target; TaskCompleteDelegate taskCompleteDelegate = Marshal.GetDelegateForFunctionPointer <TaskCompleteDelegate>(callback); DebugMessage("CoreCLREmbedding::ContinueTask (CLR) - Marshalled unmanaged callback successfully"); actualTask.ContinueWith(TaskCompleted, new TaskState(taskCompleteDelegate, context)); DebugMessage("CoreCLREmbedding::ContinueTask (CLR) - Finished"); } catch (Exception e) { DebugMessage("CoreCLREmbedding::ContinueTask (CLR) - Exception was thrown: {0}", e.Message); V8Type v8Type; Marshal.WriteIntPtr(exception, MarshalCLRToV8(e, out v8Type)); } }
//запуск задания public void Run() { bool readwrite; while (CurrentCount < countTo) { ++CurrentCount; --timeAmount; //с маленькой вероятностью запускаем операцию ввода-вывода readwrite = new Random().Next(1000) > 800; if (readwrite) { //сообщаем планировщику, что задание было заблокировано операцией ввода-вывода Timer = initialTime; TaskCompleteDelegate eventReadWrite = TaskScheduler.TaskCompleteEvent; eventReadWrite(this, st, "read/write"); //Suspend(); //return; } else if (CurrentCount % Quantum == 0) { TaskCompleteDelegate eventReadWrite = TaskScheduler.TaskCompleteEvent; eventReadWrite(this, st, "stopped"); } } //сообщаем планировщику, что задание завершено TaskCompleteDelegate eventTaskComlete = TaskScheduler.TaskCompleteEvent; eventTaskComlete(this, st, "finished"); //Suspend(); }
public TaskState(TaskCompleteDelegate callback, IntPtr context) { Callback = callback; Context = context; }