2012-02-15 47 views
2

我有类似如下的功能:使用Dispatcher.Invoke/BeginInvoke是否固有地提供对代码段的互斥访问?

public void Increment() 
{ 
    if (Count == 0) 
    { 
     AttachResource(); 
    } 

    Count++; 
} 

更改我的代码意味着这一功能将在多个线程中调用。由于AttachResource()的特性,这个函数必须在主线程上运行。

假设我修改的功能如下:

public void Increment() 
{ 
    _dispatcher.Invoke(new Action(() => 
    { 
     if (Count == 0) 
     { 
      AttachResource(); 
     } 

     Count++; 
    })); 
} 

我需要也锁定到这个代码,以确保线程互斥访问?或者,通过调度程序的调用自然通过将多个调用序列化到主线程来实现这一点?

+0

从仅在一个特定线程上运行的代码访问的任何资源从不需要使用锁保护。没有任何东西可以被锁定。 – 2012-02-15 02:21:28

+0

谢谢大家!我的方法的完整性检查表示赞赏。 – Nathanael 2012-02-15 02:28:31

回答

2

您的示例将防止AttachResource被多次调用,除非其他操作重置Count。

除此之外,假设Dispatcher是UI的调度程序实例(例如Application.Current.Dispatcher),那么只有UI线程将从该代码路径调用AttachResource。

+0

你的假设是正确的,被引用的_dispatcher用于主UI线程。 – Nathanael 2012-02-15 01:53:15

+0

在这种情况下,不需要锁定,但正如我所提到的,Count的使用只允许它运行一次,除非Count在其他地方重置为0。 – 2012-02-15 02:03:17

+0

有一个可比的递减函数,我没有列出。我正在为共享资源做一个非常基本的引用计数形式。 – Nathanael 2012-02-15 02:05:40