public static TplWorker DoWork(SetProgressValueDelegate progress, CancellationToken token) { Console.WriteLine("DoWork先頭 ManagedThreadId={0}", Thread.CurrentThread.ManagedThreadId); ParallelOptions po = new ParallelOptions(); po.CancellationToken = token; po.MaxDegreeOfParallelism = System.Environment.ProcessorCount; TplWorker instance = new TplWorker(); try { Parallel.For(0, CountOfNumbers, po, index => { po.CancellationToken.ThrowIfCancellationRequested(); instance.ProcessANumber(progress, index); }); } catch (OperationCanceledException e) { throw e; } catch (Exception e) { throw e.InnerException; } Console.WriteLine("DoWork末尾 ManagedThreadId={0}", Thread.CurrentThread.ManagedThreadId); return(instance); }
private void frmDM_DongBo_Load(object sender, EventArgs e) { lblStatus.Text = String.Empty; dgSetStatus = SetStatus; dgSetProgressMaxValue = SetProgressMaxValue; dgSetProgressCurValue = SetProgressCurValue; dgDisableChapNhanButton = SetChapNhanButtonEnableState; }
internal void ProcessANumber(SetProgressValueDelegate progress, int index) { int input = InputData[index]; string output = string.Format("{0:000}", input); RandomWait(); OutputData[index] = output; Interlocked.Increment(ref this._CountOfDone); progress.Invoke((int)((double)this._CountOfDone / CountOfNumbers * 100)); Console.WriteLine("OutputData[{0}] 終了 = {1}, ManagedThreadId={2}", index, output, Thread.CurrentThread.ManagedThreadId); }
private void Btn_ChangeProgress_Click(object sender, EventArgs e) { #if false //不使用线程的 for (int i = 0; i <= 100; i++) { Application.DoEvents(); Thread.Sleep(10);//把控制权交还给用户 progressBar1.Value = i; } for (int i = 0; i <= 100; i++) { Application.DoEvents(); Thread.Sleep(10); progressBar2.Value = i; } #endif //定义--> 声明-->实例化委托 【X】 // setProgressValue = new SetProgressValue(DelegateMethod); //新方法 【V】 【错误:线程间操作无效】 【还是要用方法呀】 setProgressValueDelegate = a => SetProgressValue(a); setProgressValueDelegate(80); }
private void SetProgressValue(int value) { if (Progress.InvokeRequired == false) { Progress.Value = value; } else { SetProgressValueDelegate d = new SetProgressValueDelegate(SetProgressValue); Progress.Invoke(d, new object[] { value }); } }