我有一个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);
它没有达到断点。!
所以整个问题在我看来程序集可以触发事件,但主应用程序无法接收它。我想知道我在哪里做错了搞砸了?有人可以提出任何建议吗?我非常感谢任何意见。
答案 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