2012-12-11 70 views
0

我有一个Windows服务,在主线程上启动一个计时器。定时器的工作是将xml文件加载到内存中,对值进行一些处理并将结果保存回文件。例如,处理过程可能需要10分钟。 (让我们称这个操作为A)主线程计时器Vs线程

我也有一个线程可以通过WCF在同一个更新xml文件的服务上产生。 (让我们称这个操作为B)

发生了什么事是操作A正在运行并且操作B在操作A完成之前运行完成。最终结果是操作A覆盖操作B完成的所有工作。

所以我想我需要做的是:

  1. 当操作A开始,如果操作B正在运行,等待 操作B到完成再执行操作A

  2. 当动作B开始,如果操作的运行,等待 操作的完成再执行操作B

如果我能做到这一点,我不会有我想的问题。

我希望这是有道理的 - 我的等待理论是做这件事的最好方法吗?我怎样才能做到这一点在C#(或任何最好的方法是)?

感谢 达摩

+2

使用[互斥](http://msdn.microsoft.com/zh-cn/library/system.threading.mutex.aspx )。 – prprcupofcoffee

+0

不错之前从来没有用过那个。 – meanbunny

回答

2

这是很容易在C#中使用lock声明解决。

您只需要一个代码的两个部分都可以访问的对象的实例(类型无关紧要)。

public static void MethodA(object lockObject) 
{ 
    lock(lockObject) 
    { 
     //code that needs to be accessed by just one thread 
    } 
} 

public static void MethodB(object lockObject) 
{ 
    lock(lockObject) 
    { 
     //code that needs to be accessed by just one thread 
    } 
} 

如果这两项操作正在从一个计时器,你应该确保添加额外的等待不会把你推到执行的代码花费的时间比计时器的时间间隔越长,点烧;如果你这样做,你最终会以比他们完成更快的速度发布新代码,并且总会有越来越多的实例在运行。 (如果以前的任务仍在运行,则无需执行任何操作即可解决此问题。)

+1

据我所知,这甚至适用于字符串。所以你可以在MethodA和MethodB中使用'lock(“critical-section”){...}'。如我错了请纠正我。 –

+1

@manuFS:你可以,但你不应该。 http://msdn.microsoft.com/en-us/library/ms182290.aspx – SLaks

+1

@manuFS你肯定**不想这样做**。有几个原因。首先,字符串具有整个实习生意,因此(因为您不确定是否启用了它,无论编译器是否选择使用它,以及它如何选择这样做),您可以它不依赖于它做任何事情。最重要的是,没有任何东西可以阻止任何人访问同一个对象实例(如果它被实现的话),这样你就可以使用同一个锁来结束几个独立的代码段。 – Servy