我有一个Windows服务,可以在主线程上启动计时器。计时器的工作是将xml文件加载到内存,对值进行一些处理并将结果保存回文件。例如,处理可能需要10分钟。 (让我们调用此操作A)
我还有一个线程,它通过WCF在更新xml文件的同一服务上生成。 (让我们调用此操作B)
正在发生的是操作A正在运行,操作B在操作A完成之前运行完成。最终结果是操作A覆盖了操作B完成的所有工作。
所以我认为我需要做的是:
操作A启动时,如果操作B正在运行,请等待 操作B完成然后执行操作A
当操作B启动时,如果操作A正在运行,请等待 操作A完成然后执行操作B
如果我能做到这一点,我认为我不会有问题。
我希望这是有道理的 - 我的等待理论是最好的方法吗? 我怎样才能在c#(或者最好的方法)中做到这一点?
感谢 达莫
答案 0 :(得分: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
}
}
如果这两个操作都是从定时器触发的,那么你应该确保添加额外的等待并不会让你进入执行代码的时间超过定时器间隔的程度。如果你这样做,最终会比他们完成的更快地解雇新代码,并且总会有越来越多的实例在运行。 (如果之前的任务仍在运行,则无法解决问题。)