0

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

我还有一个线程通过 WCF 在更新 xml 文件的同一服务上生成。(让我们称之为操作B)

发生的情况是操作 A 正在运行,而操作 B 在操作 A 完成之前运行到完成。最终结果是操作 A 覆盖了操作 B 完成的所有工作。

所以我认为我需要做的是:

  1. 当操作 A 开始时,如果操作 B 正在运行,则等待操作 B 完成然后执行操作 A

  2. 当操作 B 启动时,如果操作 A 正在运行,则等待操作 A 完成然后执行操作 B

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

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

谢谢达摩

4

1 回答 1

2

这可以通过使用lockC# 中的语句轻松解决。

您所需要的只是两个代码段都可以访问的某个对象的实例(类型无关紧要)。

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
    }
}

如果这两个操作都是从计时器触发的,您应该确保添加额外的等待不会将您推到执行代码花费的时间超过计时器间隔的地步;如果你这样做了,你最终会比它们完成更快地启动新代码,并且总会有越来越多的实例在运行。(如果先前的任务仍在运行,则可以通过让它不执行任何操作来解决此问题。)

于 2012-12-11T15:27:59.593 回答