gpt4 book ai didi

c# - 如何避免交叉检查

转载 作者:太空狗 更新时间:2023-10-29 21:49:05 25 4
gpt4 key购买 nike

我有几个作业要运行(伪代码):

public bool IsJob1Running;
public void DoJob1(...) { IsJob1Running = true; ... ; IsJob1Running = false; }

public bool IsJob2Running;
public void DoJob2(...) { IsJob2Running = true; ... ; IsJob2Running = false; }

...

在某些情况下,一次只能运行一个作业,在其他情况下 - 可以运行多个作业,但其他作业不应运行(应等待或拒绝启动)。所有这些在某些时候会导致像这样的可怕检查:

if(!IsJob1Running && !IsJob2Running && !IsJob3Running ... ) { ... }

那些突然出现在软件中的任何地方:当用户点击按钮时(或者甚至在禁用按钮之前),在开始工作之前,甚至在 DoJob 中,等等。

我讨厌它。想象一下必须添加新的 Job99 的情况。然后,软件中的所有检查都必须更新以包括 Job99 检查。

我的问题:是否存在一种模式来定义这种交叉检查(关系?),这将允许轻松添加新工作,对所有依赖项进行集中概述等?

编辑

举个例子:

Job 1, 2, 3 can run simultaneously, but not when job 4 is running (you have to check if job 4 is running before starting 1, 2 or 3 and vise-versa). Then there are job 5, 6 and 7, only one can run, when job 5 is called from within job 1 it shouldn't be called from within job 2.

最佳答案

您可以实现类似于基本作业类的东西:

public abstract class BaseJob 
{
public bool IsRunning { get; private set; }

public void Run()
{
IsRunning = true;
RunInner();
IsRunning = false;
}

public abstract void RunInner();
}

然后继承你所有的工作:

public class LoadUserDataJob : BaseJob
{
public override void RunInner()
{
// load user data
}
}

然后,您将能够获得针对您的作业的操作列表:

// Check if there is any running task
if (jobsArray.Any(j => j.IsRunning))

// Check if there is a task of type LoadUserDataJob running
// Use Where->Any instead of Single if there are many jobs of this type
if (jobsArray.Where(j => j is LoadUserDataJob).Any(j => j.IsRunning))

您还可以将其与某种Task 结合使用,并使用Task.WaitAnyTask.WaitAll 来等待执行.

谈到一个通用框架或模式,它将自动检测和检查作业依赖性、序列和执行顺序,那么我无法想象 - 它在很大程度上取决于您的业务逻辑和作业类型。

关于c# - 如何避免交叉检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37724965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com