System.Threading.Timer回调中的关键部分

时间:2013-12-19 12:52:57

标签: c# .net concurrency timer mutex

在我的应用程序中,我有许多System.Threading.Timer个实例。有一种可能性,它们中的两个会相互重叠。问题是回调方法中有一个关键部分。是我关注提供适当的同步还是框架提供解决方案?

对问题有一些疑问,所以我会更清楚地说明:回调中我目前没有同步。

2 个答案:

答案 0 :(得分:3)

  

提供适当的同步是我的关注吗

如果它很重要并且它应该具有互斥的访问权限,那么您需要自己处理它。

  

框架是否提供解决方案

Framework确实提供了多种锁定和监控工具。这取决于您的要求您需要什么。您需要查看here以查看框架提供的内容。

  

lock关键字确保一个线程不进入代码的关键部分,而另一个线程处于临界区。如果另一个线程试图输入一个锁定的代码,它将等待,阻塞,直到该对象被释放。

您还可以选择使用Mutex

  

当两个或多个线程需要同时访问共享资源时,系统需要一个同步机制来确保一次只有一个线程使用该资源。 Mutex是一个同步原语,它只允许对一个线程的共享资源进行独占访问。如果某个线程获取了一个互斥锁,那么想要获取该互斥锁的第二个线程将被挂起,直到第一个线程释放该互斥锁。

答案 1 :(得分:1)

你肯定不得不“关注自己”。如果您选择不这样做,那么您将为您的应用程序引入竞争条件,从而导致不必要的行为。

.NET提供了许多解决方案,每个解决方案都有优缺点。简要列表可包括:

  • 锁定 - 我会说简化方法。你会lockcallback方法上改变的共享内存。这样,一次只能有一个线程改变对象。如果你有多个线程总是在等待释放锁定,那么这就失败了。锁的开销可能会使一切变慢,而不仅仅是使用单个线程。

  • 读/写锁 - 与lock类似,但现在不是进行通用锁定,而是可以从共享内存中读取多个线程并仅锁定所有内容当你需要write lock时。这可以允许多个线程同时安全地访问内存。

  • TPL(任务并行库) - 特定于.NET。这很可能是您最复杂的解决方案,可能需要更改数据结构。但我想把它放在这里因为我认为它提供了一个非常强大的解决方案。使用TPL进行简单的解释是,一次只有一个线程在共享内存上运行,但是这样做时不会阻塞其他线程...所以这样可以避免让多个线程弄乱你的对象并导致竞争条件,但你也不会占用几个线程。一个很好的起点可能是查看Data Flow文档,看看哪种数据结构最符合您的需求。

还有其他几个选项,所以不要把它当作一个完整的列表......在大多数情况下我会推送TPL ......