主要应用程序没有响应事件?

时间:2014-01-28 18:48:54

标签: c# .net multithreading events

我有一个dll / assembly和一个主应用程序,它们是独立的项目。这是C#VS2008。

定期检查某个特定字符串是否写入.txt文件的dll /程序集;找到字符串后,它将触发一个事件:

 public delegate void IjmFinishedEventHandler(object sender, EventArgs e);

 public class FijiLauncherControl
{
    System.Timers.Timer _logFileCheckTimer;       // log file status check timer; reading every 1/4 second 

   public event IjmFinishedEventHandler IjmFinished;

    // Invoke the Changed event; called whenever list changes
    protected virtual void OnIjmFinished(EventArgs e)
    {
        if (IjmFinished != null)
            IjmFinished(this, e);

    }

 void _logFileCheckTimer_Elapsed(object sender, EventArgs e)  // tick check task finish
    {
        if (_processOn && IsLogOn)
        {
            try
            {
                _processFinished = CheckStatuts();

                if (_processFinished)
                {          
                    OnIjmFinished(EventArgs.Empty);
                }
            }
            catch (Exception ex)
            {

            }
        }
    }   

    public bool CheckStatuts()  // check if string is written in file
        {
            bool ret;
            var lastLine = File.ReadAllLines(_logFile).Last();

            ret = String.Compare(lastLine, _doneStr) == 0 ? true : false;

            return ret;
        }

  public FijiLauncherControl()   //start the timer
    {
        _logFileCheckTimer = new System.Timers.Timer(250);  // read log 4 times per sec 
        _logFileCheckTimer.Enabled = true;
        _logFileCheckTimer.Elapsed += new        System.Timers.ElapsedEventHandler(_logFileCheckTimer_Elapsed);
        }
    }

在我的主应用程序中,我添加了这个dll作为参考,并且基本上尝试监视事件(从我猜的dll)每当被特定字符串触发时都会被写入.txt文件:

    public partial class Window1 : Window
    {
            private FijiLauncherControl _fl;


        void Window1_Unloaded(object sender, RoutedEventArgs e)
        {
            _fl.IjmFinished -= new IjmFinishedEventHandler(_fl_IjmFinished);

        }

        void Window1_Loaded(object sender, RoutedEventArgs e)
        {

            _fl.IjmFinished += new IjmFinishedEventHandler(_fl_IjmFinished);
        }

        void _fl_IjmFinished(object sender, EventArgs e)
        {
            _vm.IjmFinished = true;
            System.Media.SystemSounds.Beep.Play();            
        }    

    }

然而,

void _fl_IjmFinished(object sender, EventArgs e)
        {
            _vm.IjmFinished = true;
            System.Media.SystemSounds.Beep.Play();            
        }

即使特定字符串确实写入.txt,它也永远不会响应。似乎事件永远不会从程序集中触发。但是如果我在程序集中设置一个断点,那么

奇怪的是,我必须将断点设置为if (_processFinished),然后它会点击OnIjmFinished(EventArgs.Empty);但是我把断点放在OnIjmFinished(EventArgs.Empty);它没有达到断点。!

所以整个问题在我看来程序集可以触发事件,但主应用程序无法接收它。我想知道我在哪里做错了搞砸了?有人可以提出任何建议吗?我非常感谢任何意见。

1 个答案:

答案 0 :(得分:1)

检查Window1_Loaded是否实际连线,如果您通过Windows窗体设计器注册了它,有时会在重新生成代码后丢失。

如果您确实在Window1_Loaded找到所有引用并且没有引用那么这就是您的问题,只需进入设计器并将事件处理程序重新连接到WindowLoaded事件。

此外,您可以使用EventHandler中的System代理,而不是声明自己的代理:

public event EventHandler IjmFinished;

你的提升事件方法不是线程安全的,你应该使用这种模式:

protected virtual void OnIjmFinished(EventArgs e)
{
    var finished = IjmFinished;

    if (finished != null) { finished(this, e); }
}

您目前的方式允许其他线程上的订阅者在if之间取消注册并引发该事件,从而导致您难以调试NullReferenceException