是否可以包装特定的类或方法并将它们分配给一个线程?

Wib*_*ble 5 .net c# methods multithreading

我有一个XAML表单,我希望从主XAML执行线程中穿出两个独立的功能:1.)一个计时器控件,它会勾选,以及2.)实现一个暂停按钮,这样我就可以冻结一组程序性的活动再次单击暂停按钮将恢复.

当我启动表单时,整个应用程序冻结.因此,我无法与btnPause控件进行交互.我让计时器类工作,但它(lblTimer)以块的形式更新,或者当它看起来CPU在主线程上不忙时.

我试图创建一个类"任务",它在自己的线程中包装一个类或方法,以便我可以控制.

    Automation.Task AutomationThread = new Automation.Task();
    Automation.Task TimerThread = new Automation.Task();
Run Code Online (Sandbox Code Playgroud)

后来,我尝试创建一个秒表类并为其分配TimerThread,以便我可以独立管理它.

    Automation.WatchTimer stopwatch = new Automation.WatchTimer(lblTimer, TimerThread);


class Task
{
    private ManualResetEvent _shutdownFlag = new ManualResetEvent(false);
    private ManualResetEvent _pauseFlag = new ManualResetEvent(true);

    Thread _thread;

    public Task() { }

    public void Start()
    {
        _thread = new Thread(DoWork);
        _thread.Start();
    }

    public void Resume()
    {
        _pauseFlag.Set();
    }

    public void Stop()
    {
        _shutdownFlag.Set();
        _pauseFlag.Set();
        _thread.Join();
    }

    public void DoWork()
    {
        do
        {
            _pauseFlag.WaitOne(Timeout.Infinite);
        }
        while (!_shutdownFlag.WaitOne(0));
    }

    // I AM NOT SURE IF THIS IS THE RIGHT APPROACH
    public void DoWork(Func<void> method????)
    {
        do
        {
            // NOT SURE WHAT TO PUT HERE
            // This is where I want it to do a method 
            // that wraps a long chain of procedural items
            // where I can pause (block) and unpause through the UI
        }
        while (!_shutdownFlag.WaitOne(0));
    }

class WatchTimer
{
    public WatchTimer(System.Windows.Controls.Label lbl, Automation.Task worker)
    {
        lblField = lbl;
        worker.Start();
    }

    private System.Windows.Controls.Label lblField;

    Timer time = new Timer();
    Stopwatch sw = new Stopwatch();

    public void Start()
    {
        time.Start();
        sw.Start();
        time.Tick += new EventHandler(time_Tick);
    }

    public void Stop()
    {
        time.Stop();
        sw.Stop();
    }

    public void Reset()
    {
        sw.Reset();
        lblField.Content = this.elapsedTime();
    }

    public string elapsedTime()
    {
        TimeSpan ts = sw.Elapsed;
        // return formatted TimeSpan value
        return String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
    }

    private void time_Tick(object sender, EventArgs e)
    {
        lblField.Content = this.elapsedTime();
    }

}
Run Code Online (Sandbox Code Playgroud)

计时器似乎工作,但它仍然以块的形式吐出更新 - 这是否意味着它不在自己的线程上?

Chr*_*s O 0

明显的挂起是因为一个 CPU 固定在 100% 造成的。这是因为 的初始状态_pauseFlag被设置为有信号。因此,当主线程调用 时new Thread(DoWork),DoWork会不断地越过_pauseFlag.WaitOne并在紧密do/while循环中运行。

将某些方法包装在线程中并暂停,这是可行的。您必须do/while从DoWork方法中删除 。因此,您的顺序代码DoWork必须经常检查子任务、内部循环或顺序工作方法中的任何内容之间的暂停事件信号状态。