C# C语言中的方法和计时器#
当我用F10按钮一步一步地调试这个小程序时,程序是合理的,直到它达到C# C语言中的方法和计时器#,c#,methods,timer,C#,Methods,Timer,当我用F10按钮一步一步地调试这个小程序时,程序是合理的,直到它达到timer.appeased+=的级别。在此之后,它应该调用我的方法Check(MyConn),但它没有!它回到MyConn.Close()然后它在这两者之间反弹,然后突然关闭程序 我想知道这个问题是从哪里来的。。。可能是这一行:timer.appeased+=(timerSender,timerEvent)=>timer\u appeased(timerSender,timerEvent,MyConn)?这是在这个论坛上发布的
timer.appeased+=
的级别。在此之后,它应该调用我的方法Check(MyConn)
,但它没有!它回到MyConn.Close()代码>然后它在这两者之间反弹,然后突然关闭程序
我想知道这个问题是从哪里来的。。。可能是这一行:timer.appeased+=(timerSender,timerEvent)=>timer\u appeased(timerSender,timerEvent,MyConn)代码>?这是在这个论坛上发布的一个解决方案,以防我想把参数MyConn
交给timer\u
提前感谢您的帮助
static void Main(string[] args)
{
// create connection
string ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\mike\\Documents\\Database1.mdb;";
OleDbConnection MyConn = new OleDbConnection(ConnStr);
MyConn.Open();
initTimer(MyConn);
MyConn.Close();
}
static void initTimer(OleDbConnection MyConn)
{
//set up a timer
Timer timer = new Timer();
timer.Interval = 2000; // check every 2s (2000ms) if the values in the database changed
timer.Enabled = true; //enable the timer, so when the timer elapses after 2s, it performs some calculations
timer.Elapsed += (timerSender, timerEvent) => timer_Elapsed(timerSender, timerEvent, MyConn);
}
static void timer_Elapsed(object sender, ElapsedEventArgs e, OleDbConnection MyConn)
{
Check(MyConn); // Check is a method I have in my program which takes as argument "MyConn"
}
这是完全正常的行为
timer.appeased+=
代码仅注册一个事件。2秒后,事件将被触发,但主线程将正常继续并返回到main()
函数。然后它将调用MyConn.Close()
,然后结束Main()
函数
如果这是一个控制台应用程序,那么它将是程序的结束,这意味着没有时间运行timer\u expressed
事件
如果它是一个将“保持活动状态”的应用程序,如服务或表单应用程序,那么当计时器\u已过
事件触发时,连接将已经关闭
我建议如果你有一个“保持活力”的应用程序,那么你应该将打开/关闭连接代码移动到实际使用它们的函数中。在这种情况下,它将在timer\u expressed
事件中
如果你没有“保持活力”的应用程序,那么你可能应该完全避免使用计时器(以及任何带有独立线程的应用程序)
顺便说一下,我一直在说“活着”,我希望你明白我的意思。我不知道更专业的术语来描述它。这是完全正常的行为
timer.appeased+=
代码仅注册一个事件。2秒后,事件将被触发,但主线程将正常继续并返回到main()
函数。然后它将调用MyConn.Close()
,然后结束Main()
函数
如果这是一个控制台应用程序,那么它将是程序的结束,这意味着没有时间运行timer\u expressed
事件
如果它是一个将“保持活动状态”的应用程序,如服务或表单应用程序,那么当计时器\u已过
事件触发时,连接将已经关闭
我建议如果你有一个“保持活力”的应用程序,那么你应该将打开/关闭连接代码移动到实际使用它们的函数中。在这种情况下,它将在timer\u expressed
事件中
如果你没有“保持活力”的应用程序,那么你可能应该完全避免使用计时器(以及任何带有独立线程的应用程序)
顺便说一下,我一直在说“活着”,我希望你明白我的意思。我不知道更专业的术语来描述它。设置计时器后,代码将继续运行。它将离开initTimer
方法,然后关闭连接。之后,Main
函数将退出,导致应用程序关闭。你的计时器也将终止
如果您的程序没有终止,计时器将从2000开始倒计时。当它达到零时,将触发事件。这发生在另一个线程上,与主线程平行。您的服务器将检查连接,该连接显然将被关闭
如果你想让主要威胁等到事件触发,为什么要使用计时器呢?为什么不这样做呢
static void Main(string[] args)
{
// create connection
string ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\mike\\Documents\\Database1.mdb;";
using(OleDbConnection MyConn = new OleDbConnection(ConnStr))
{
MyConn.Open();
do
{
Thread.Sleep(2000);
Check(MyConn);
}
while(someValueToIndicateTheApplicationCanTerminate);
}
}
设置计时器后,代码将继续运行。它将离开initTimer
方法,然后关闭连接。之后,Main
函数将退出,导致应用程序关闭。你的计时器也将终止
如果您的程序没有终止,计时器将从2000开始倒计时。当它达到零时,将触发事件。这发生在另一个线程上,与主线程平行。您的服务器将检查连接,该连接显然将被关闭
如果你想让主要威胁等到事件触发,为什么要使用计时器呢?为什么不这样做呢
static void Main(string[] args)
{
// create connection
string ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\mike\\Documents\\Database1.mdb;";
using(OleDbConnection MyConn = new OleDbConnection(ConnStr))
{
MyConn.Open();
do
{
Thread.Sleep(2000);
Check(MyConn);
}
while(someValueToIndicateTheApplicationCanTerminate);
}
}
有两件事-例外是什么?那么,Check
如何处理MyConn
对象?因为你在计时器有机会使用之前就立即关闭了连接。有几件事-例外是什么?那么,Check
如何处理MyConn
对象?因为你在计时器有机会使用它之前就立即关闭了连接。我不知道事件发生在另一个线程上,现在这是有意义的,因为它们在同一时间运行。我想要的是每一圈时间(在我的示例2sec中)来执行我的方法“Check(MyConn)”。按照你写它的方式,你把“Thread.Sleep(3000)”放进去,这是否意味着你让主线程睡眠3秒??如果是这样,我看不出“Check(MyConn)”方法是如何运行的,因为您刚刚关闭了连接,不是吗?是的<代码>线程。睡眠(3000)
表示等待3秒钟。我不知道你的支票检查的是什么。它是否检查了打开或关闭的连接?或者可能是你的其他人?当然,您可以在关闭连接的代码之前移动我的延迟代码。实际上,检查方法不会检查连接是否关闭。它只是检查我的数据库中的值是否发生了变化,我希望非常接近实时检查,所以我每2秒设置一次;睡眠(3000);MyConn.Close();--我