具有启动,暂停和停止事件处理的动态线程

imd*_*sen 5 events multithreading delegates winforms c#-4.0

我已经创建了示例应用程序并实现了线程.基本上我的目标是渴望这个应用程序

  1. 如果运行任何进程,则用户界面应通知[ DONE ]
  2. 使用ProgressBar [ DONE ] 处理动态创建的线程
  3. 为可用进度列表中的"启动","暂停"和"停止"线程提供附加功能.[ 需要你的帮助 ]

注意: -我对线程和代理知之甚少,所以请让我知道现有代码的最佳解决方案.

使用文件和控件: - 本演示应用程序中基本上使用了三个文件

  1. ProgressForm.cs(Window Form)包含Button以创建新进度和Container whic将包含所有创建的进度条

  2. ProgressClass.cs 包含动态线程和委托通知UI而不锁定或挂起用户界面

  3. ProgressControl.cs(用户控制)
  4. 其中包含
  5. 进度条(显示完成的过程)
  6. 上市标签(已完成进度的显示百分比)
  7. 开始/暂停按钮(用于播放/暂停线程)
  8. 停止按钮(停止运行线程并从列表中删除进度)
  9. StartTime标签(显示进程开始时间)
  10. EndTime标签(完成过程的显示时间)
  11. MaxValue Lable(生成25到100之间的随机数)

CODE SNIPPET: - 1. ProgressForm .cs

public partial class ProgressForm : Form
    {
        Random randomMaxValue = new Random();
        public ProgressForm()
        {
            InitializeComponent();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
             ProgressClass m_clsProcess;
             ProgressControl progress = new ProgressControl();
             progress.StartedAt = DateTime.Now;
             progress.MinValue = 0;
             progress.CurrentValue = 0;
             progress.MaxValue = randomMaxValue.Next(25, 100);
             AddControl(progress);
             m_clsProcess = new ProgressClass(progress, this, new ProgressClass.NotifyProgress(DelegateProgress));
             m_clsProcess.Start();
        }
        private void DelegateProgress(int CurrentValue, ProgressControl Progress)
        {
            ProgressBar p = (ProgressBar)Progress.Controls.Find("pgbPercent", false)[0];
            p.Minimum = Progress.MinValue;
            p.Value = CurrentValue;
            p.Maximum = Progress.MaxValue;

            Label percent = (Label)Progress.Controls.Find("lblPercent", false)[0];
            percent.Text = string.Format("{0:#00} %", Convert.ToInt16((CurrentValue * 100) / Progress.MaxValue));

            Label start = (Label)Progress.Controls.Find("lblStart", false)[0];
            start.Text = string.Format("{0:HH:mm:ss}", Progress.StartedAt);

            if (CurrentValue == Progress.MaxValue)
            {
                Label complete = (Label)Progress.Controls.Find("lblComplete", false)[0];
                complete.Text = string.Format("{0:HH:mm:ss}", DateTime.Now);
                Progress.Status = ProgressControl.ProgressStatus.Completed;
            }

            Label max = (Label)Progress.Controls.Find("lblMaxValue", false)[0];
            max.Text = string.Format("{0:#00}", Progress.MaxValue);

            Button btnstartstop = (Button)Progress.Controls.Find("btnStartStop", false)[0];
            btnstartstop.Click += new EventHandler(ProgressStartStop);
        }
        private void AddControl(Control ctl)
        {
            tableLayoutPnl.RowCount += 1;
            tableLayoutPnl.RowStyles.Add(new RowStyle());
            ctl.Dock = DockStyle.Fill;
            tableLayoutPnl.Controls.Add(ctl, 0, tableLayoutPnl.RowCount - 1);
        }
        void ProgressStartStop(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            //
            //Here i would like to write a code for START / PAUSE thread and update Image acording too.
            //
        }
    }
Run Code Online (Sandbox Code Playgroud)

2. ProgressControl.cs

public partial class ProgressControl : UserControl
    {
        public enum ProgressStatus
        {
            Initialize,
            Running,
            Paused,
            Completed
        }

        public DateTime StartedAt { get; set; }
        public DateTime CompletedAt { get; set; }
        public int MinValue { get; set; }
        public int CurrentValue { get; set; }
        public int MaxValue { get; set; }
        public ProgressStatus Status { get; set; }

        public ProgressControl()
        {
            InitializeComponent();
            this.Status = ProgressStatus.Initialize;
        }
    }
Run Code Online (Sandbox Code Playgroud)

3. ProgressClass.cs

public class ProgressClass
{
    private int ThreadWaitTime = 100;
    private ProgressControl m_progress;
    private NotifyProgress m_clsNotifyDelegate;
    private System.Threading.Thread m_clsThread;

    private System.ComponentModel.ISynchronizeInvoke m_clsSynchronizingObject;
    public delegate void NotifyProgress(int PercentComplete, ProgressControl Progress);

    public ProgressClass(ProgressControl Progress, System.ComponentModel.ISynchronizeInvoke SynchronizingObject, NotifyProgress NotifyDelegate)
    {
        m_progress = Progress;
        m_clsSynchronizingObject = SynchronizingObject;
        m_clsNotifyDelegate = NotifyDelegate;
    }

    public void Start()
    {
        m_clsThread = new System.Threading.Thread(DoProcess);
        m_clsThread.Name = "Background Thread";
        m_clsThread.IsBackground = true;
        m_progress.Status = ProgressControl.ProgressStatus.Running;
        m_clsThread.Start();
    }
    private void DoProcess()
    {
        for (int i = m_progress.MinValue; i <= m_progress.MaxValue; i++)
        {
            NotifyUI(i);
            Thread.Sleep(ThreadWaitTime);
        }
    }
    private void NotifyUI(int Value)
    {
        object[] args = new object[2];
        args[0] = Value;
        args[1] = m_progress;
        m_clsSynchronizingObject.Invoke(m_clsNotifyDelegate, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不是要求写整个代码而不是提供提示.

我想从列表开始/暂停相关的线程,操作系统该怎么办?我想跟随以下功能:

   void ProgressStartStop(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            //Here i would like to write a code for START / PAUSE thread and update Image acording too.
        }
Run Code Online (Sandbox Code Playgroud)

更新:

在此输入图像描述

Chr*_*ain 0

挂起线程通常被认为是不好的做法(尽管这是可能的)。暂停和终止线程的正确方法是通过与线程正在执行的作业配合。该作业应检查循环中的变量,并相应地暂停或退出。控制程序可以设置该变量,如果需要反馈,后台线程可以在退出或休眠之前调用通知方法。