【问题标题】:Timer or Thread?计时器还是线程?
【发布时间】:2012-07-06 04:30:16
【问题描述】:

我有一个方法(比如 method1)写入数据库(sqlserver)和另一个方法(比如 method2)在一段时间后尝试访问同一个数据库并更新由 method1 创建的数据行。

由于 LAN 断开连接,method1 无法访问 db 时会出现问题(这不是例外,这是我的软件中肯定会出现的情况,深入细节会使问题变得过于复杂)如果 method1 无法访问access db method2 无法正常工作。

如果 LAN 断开连接,我想要做的是让方法 1 将值存储到本地数据库而不是服务器,并且一旦它在本地数据库中输入值,应用程序应该在 10-15 秒后开始尝试访问服务器.

我应该使用什么计时器或创建一个新线程?

【问题讨论】:

  • 您的 LAN 断开连接,您希望您的应用每 10-15 秒尝试重新连接一次!?听起来解决方案是修复网络。线程消耗的资源比计时器少。
  • LAN 不会自行断开连接......正如我告诉你的,这不是一个例外,这种情况会发生多久,我不知道
  • @JeremyThompson,“一个线程消耗的资源比一个计时器少”是一个非常有问题的说法......创建一个线程不是免费的,至少会占用一些内存空间用于堆栈,不像计时器。
  • @AlexeiLevenkov - 我的意思不是秒表 - 我的意思是像 Winforms 计时器控件一样的计时器 - 我应该澄清一下。
  • @JeremyThompson,我明白了。我仍然认为苹果与橘子的比较 - 很难说什么更昂贵,因为它们消耗不相关的资源(线程的内核对象与托管堆+定时器控制的消息)。

标签: c# multithreading timer


【解决方案1】:

要在一段时间后执行某个操作,Timer 可能是最好的选择。

计时器:在应用程序中生成重复事件。

【讨论】:

    【解决方案2】:

    您需要在未来某个时间启动长时间运行(可能冻结 GUI)的操作。您可以使用计时器在间隔后开始操作,并使用线程来执行长时间的后台操作。

    【讨论】:

      【解决方案3】:

      下面的链接在 c# 中演示了一个通用轮询组件,它以指定的时间间隔运行并使用后台线程来执行指定的用户操作。您可以使用此操作检查本地数据库并执行必要的操作。

      示例用法:

      IPoller poller = new UrlPoller(args[0], TimeSpan.FromSeconds(7));
      IPolling pollingComponent = new Polling.Core.Polling(poller);
      pollingComponent.SubscribeForPollingUpdates(PollingAction);
      pollingComponent.Start();
      

      代码和完整示例见:

      http://www.avantprime.com/blog/24/an-example-of-repeating-code-using-a-worker-thread-without-using-timers-c

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 2014-08-18
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        相关资源
        最近更新 更多