예제 #1
0
        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);
        }
예제 #2
0
 private void frmDM_DongBo_Load(object sender, EventArgs e)
 {
     lblStatus.Text          = String.Empty;
     dgSetStatus             = SetStatus;
     dgSetProgressMaxValue   = SetProgressMaxValue;
     dgSetProgressCurValue   = SetProgressCurValue;
     dgDisableChapNhanButton = SetChapNhanButtonEnableState;
 }
예제 #3
0
        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);
        }
예제 #4
0
        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 });
     }
 }