从另一个线程观察变量?

时间:2014-01-23 20:30:18

标签: c# multithreading timer

我有一个C#库,里面有一个定时器,可以不断检查一个布尔变量ProcessFinishedProcessFinished初始化为false。

我想要的是主应用程序需要从库中查看变量Status,并且一旦此ProcessFinished变为true,就会显示一个消息框。

我遇到的问题如果我简单地执行主应用程序,则消息框永远不会显示,但如果我进入主应用程序,则会显示。

以下是主应用程序中的timer_tick代码:

    public Window1()
    {
        _fl = new FijiLauncherControl();

        this._statusTimer = new System.Windows.Forms.Timer();  // read log 4 times per sec 
        this._statusTimer.Interval = 125;
        this._statusTimer.Tick += new EventHandler(_statusTimer_Tick);
        InitializeComponent();
    }

    void _statusTimer_Tick(object sender, EventArgs e)
    {
        try
        {
            if (_fl.ProcessFinished)
            {
                System.Windows.MessageBox.Show("Process is finished");
                _statusTimer.Stop();
            }
        }
        catch (Exception ex)
        {
        }
    }      

    private void FijiLaucherButton_Click(object sender, RoutedEventArgs e)
    {         
        _statusTimer.Start();           
        _fl.LaunchFiji();

    }

其中_fl是来自其他库的类的对象。

在库中,定时器代码如下:

 public FijiLauncherControl()
        {
            _ijmFile = "";
            _fijiExeFile = "";
            _logFile = "";
            _outputDir = "";
            _isLogOn = false;
            _processOn = false;
            _processFinished = false;
            _headless = true;
            _doneStr = "Procedure is finished.";

            _logFileCheckTimer = new System.Timers.Timer(500);  // read log 4 times per sec 
            _logFileCheckTimer.Enabled = true;
            _logFileCheckTimer.Elapsed += new System.Timers.ElapsedEventHandler(_logFileCheckTimer_Elapsed);
        }

        void _logFileCheckTimer_Elapsed(object sender, EventArgs e)
        {
            if (_processOn && IsLogOn)
            {
                try
                {
                    _processFinished = CheckStatuts();
                }
                catch (Exception ex)
                {

                }
            }
        }

我想知道这里发生了什么?无论如何,我可以看到消息框显示没有踩到?从主应用程序中查看ProcessFinished的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

从线程中触发事件并抓住它会不会更好。然后显示消息框?

喜欢这样吗?

using System;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click( object sender, EventArgs e )
        {
            var logChecker = new LogChecker();
            logChecker.FinishedExvent += () => MessageBox.Show( "Finished" );
            logChecker.Start();
        }
    }

    internal class LogChecker
    {
        public void Start()
        {
            var thread = new Thread( CheckLog );
            thread.Start();
        }

        private void CheckLog()
        {
            var progress = 0;
            while ( progress < 3000 )
            {
                Thread.Sleep( 250 );
                progress += 250;
            }
            FinishedExvent();
        }

        public event TestEventHandler FinishedExvent;
    }

    internal delegate void TestEventHandler();
}

答案 1 :(得分:0)

尝试

   volatile bool _processFinished;