Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的方法和计时器#_C#_Methods_Timer - Fatal编程技术网

C# C语言中的方法和计时器#

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)?这是在这个论坛上发布的

当我用F10按钮一步一步地调试这个小程序时,程序是合理的,直到它达到
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();--我