IntPtr _work; //CreateThreadpoolWork. Not used with simple callbacks. /// <exception cref="Win32Exception"/> /// <exception cref="InvalidOperationException">(only when completionCallback is used) This thread has a synchronization context other than WindowsFormsSynchronizationContext or null; or it is null and thread's GetApartmentState is not STA.</exception> internal Work(object state, WorkCallback workCallback, SendOrPostCallback completionCallback, bool createWork) { _state = state; _workCallback = workCallback; if (completionCallback != null) { _completionCallback = completionCallback; //we need WindowsFormsSynchronizationContext to call _completionCallback in this thread _context = EnsureWindowsFormsSynchronizationContext_.EnsurePermanently(); //SHOULDDO: loads Forms dll. Try to avoid it. Also, test with WPF. } _gc = GCHandle.Alloc(this); Debug.Assert(sizeof(GCHandle) == IntPtr.Size); //we declare API IntPtr parameters as GCHandle if (createWork) { _work = CreateThreadpoolWork(_workCallbackDelegate, _gc, ref _env); } else { bool ok = TrySubmitThreadpoolCallback(_simpleCallbackDelegate, _gc, ref _env); //Debug.Assert(ok); if (!ok) { throw new Win32Exception(); } } }
public Task(TaskControl control, WorkCallback workproc, WaitCallback oncomplete, object state) { this.workproc = workproc; this.oncomplete = oncomplete; this.control = control; this.state = state; }
private void mBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { object[] parameters = (object[])e.Argument; int currentStepNumber = (int)parameters[0]; var shapeValues = (List <object>)parameters[1]; Thread.CurrentThread.CurrentCulture = (CultureInfo)parameters[2]; Thread.CurrentThread.CurrentUICulture = (CultureInfo)parameters[3]; e.Result = WorkCallback?.Invoke(currentStepNumber, shapeValues); }
/// <summary> /// Breaks/Stops current work. /// </summary> internal void InternalBreakWork() { if (!WorkActive) { return; } // reset last work WorkActive = false; WorkSessionId = 0; WorkCallback?.Invoke(); WorkCallback = null; }
TaskControl AddUserTaskToQueue(WorkCallback workproc, WaitCallback oncomplete, object state) { TaskControl control = new TaskControl(); if (thread == null) { thread = new WorkingThread(); } thread.AddTask(new Task(control, workproc, oncomplete, state)); return(control); }
public void Start(WorkCallback work, object state) { lock (this) { if (m_thread != null) { throw new Exception("work is already started!"); } m_state = state; m_workCallback = work; m_thread = new Thread(new ThreadStart(WorkThread)); m_thread.IsBackground = true; m_thread.Name = "WorkThread"; m_thread.Start(); } }
public IAsyncResult BeginInvoke(object arg, AsyncCallback asyncCallback, object state, int timeout) { wrapper = delegate(object argv) { AutoResetEvent e = new AutoResetEvent(false); try { TimeoutState waitOrTimeoutState = new TimeoutState(Thread.CurrentThread, state); ThreadPool.RegisterWaitForSingleObject(e, WaitOrTimeout, waitOrTimeoutState, timeout, true); return(workCallback(argv)); } finally { e.Set(); } }; IAsyncResult asyncResult = wrapper.BeginInvoke(arg, asyncCallback, state); return(asyncResult); }
/// <summary> /// 开始调用委托 /// </summary> /// <param name="arg"></param> /// <param name="asyncCallback"></param> /// <param name="state"></param> /// <param name="timeout"></param> /// <returns></returns> public IAsyncResult BeginInvoke(object arg, AsyncCallback asyncCallback, object state, int timeout) { wrapper = delegate(object argv) { AutoResetEvent e = new AutoResetEvent(false); try { TimeoutState waitOrTimeoutState = new TimeoutState(Thread.CurrentThread, state); ThreadPool.RegisterWaitForSingleObject(e, WaitOrTimeout, waitOrTimeoutState, timeout, true); return workCallback(argv); } finally { e.Set(); } }; IAsyncResult asyncResult = wrapper.BeginInvoke(arg, asyncCallback, state); return asyncResult; }
public void Start(WorkCallback work, object state) { lock (this) { if (m_thread != null) throw new Exception("work is already started!"); m_state = state; m_workCallback = work; m_thread = new Thread(new ThreadStart(WorkThread)); m_thread.IsBackground = true; m_thread.Name = "WorkThread"; m_thread.Start(); } }
/// <summary> /// Creates a <see cref="Work"/> object that can be used when need more options than <see cref="SubmitCallback"/> has. /// </summary> /// <param name="state">Something to pass to the callback functions.</param> /// <param name="workCallback">Callback function to call in a thread pool thread.</param> /// <param name="completionCallback">Optional callback function to call in this thread after workCallback.</param> /// <remarks> /// Call Dispose() to avoid memory leaks. If not called, the object and related OS object remain in memory until this process ends. /// </remarks> /// <exception cref="Win32Exception"/> /// <exception cref="InvalidOperationException">(only when completionCallback is used) This thread has a synchronization context other than WindowsFormsSynchronizationContext or null; or it is null and thread's GetApartmentState is not STA.</exception> public static Work CreateWork(object state, WorkCallback workCallback, SendOrPostCallback completionCallback = null) { return(new Work(state, workCallback, completionCallback, true)); }
/// <summary> /// Requests that a thread pool thread call the callback function. /// </summary> /// <param name="state">Something to pass to the callback functions.</param> /// <param name="workCallback">Callback function to call in a thread pool thread.</param> /// <param name="completionCallback">Optional callback function to call in this thread after workCallback.</param> /// <exception cref="Win32Exception"/> /// <exception cref="InvalidOperationException">(only when completionCallback is used) This thread has a synchronization context other than WindowsFormsSynchronizationContext or null; or it is null and thread's GetApartmentState is not STA.</exception> public static void SubmitCallback(object state, WorkCallback workCallback, SendOrPostCallback completionCallback = null) { new Work(state, workCallback, completionCallback, false); }
TaskControl AddUserTaskToQueue( WorkCallback workproc, WaitCallback oncomplete, object state ) { TaskControl control = new TaskControl(); if( thread == null ) thread = new WorkingThread(); thread.AddTask(new Task(control,workproc,oncomplete,state)); return control; }
/// <summary> /// 实例化CancellableTask /// </summary> /// <param name="workCallback"></param> /// <param name="cancelCallback"></param> public CancellableTask(WorkCallback workCallback, CancelCallback cancelCallback) { this.workCallback = workCallback; this.cancelCallback = cancelCallback; }
/// <summary> /// 实例化CancellableTask /// </summary> /// <param name="workCallback"></param> public CancellableTask(WorkCallback workCallback) { this.workCallback = workCallback; }
public ThreadPool(int maxThreads, int maxQueuedItems, WorkCallback /* ! */ workCallback)
public static TaskControl QueueUserWorkItem( WorkCallback workproc, WaitCallback oncomplete, object state ) { return ThreadQueue.Instance.AddUserTaskToQueue(workproc, oncomplete, state); }
public static TaskControl QueueUserWorkItem(WorkCallback workproc, WaitCallback oncomplete, object state) { return(ThreadQueue.Instance.AddUserTaskToQueue(workproc, oncomplete, state)); }
public WorkItem(WorkCallback callback, object userObject) { this.callback = callback; this.userObject = userObject; }