C# 逐个运行任务,其中包含检查

C# 逐个运行任务,其中包含检查,c#,task,C#,Task,因此,我有多个不同的任务,我想在前一个任务完成后运行。 我可以这样做来运行它们,但我需要检查实体是否存在,它们是否处于活动状态 var t1 = await spawnEntities(); if (!t1) goto cancel; var t2 = await goToLocation(); if (!t2) goto cancel; var t3 = await goToPed(); if (!t3) goto cancel; await goToBase(); cancel:

因此,我有多个不同的任务,我想在前一个任务完成后运行。 我可以这样做来运行它们,但我需要检查实体是否存在,它们是否处于活动状态

var t1 = await spawnEntities();
if (!t1) goto cancel;

var t2 = await goToLocation();

if (!t2) goto cancel;
var t3 = await goToPed();

if (!t3) goto cancel;
await goToBase();

cancel:
   removeEntities();
以下是关于其中一项任务的简短示例:

private async Task<bool> goToLocation()
{
    if (!runCheck()) return false;
    Vector3 targetLocation = Game.PlayerPed.Position;
    officer1.Task.DriveTo(targetLocation);

    if (!runCheck()) return false;
    while (!policeCar.IsInRangeOf(targetLocation, 50.0f) || !runCheck()) await Delay(500);
    if (!runCheck()) return false;
        
    return true;
}
private异步任务goToLocation()
{
如果(!runCheck())返回false;
Vector3 targetLocation=Game.PlayerPed.Position;
officer1.任务.DriveTo(目标定位);
如果(!runCheck())返回false;
当(!policcar.IsInRangeOf(targetLocation,50.0f)| | |!runCheck())等待延迟时(500);
如果(!runCheck())返回false;
返回true;
}
runCheck
方法检查实体是否存在并且它们是否处于活动状态,并返回布尔值。问题是它“有点”混乱,我还有更长更复杂的任务,我必须检查它们,否则如果玩家杀死了一个ped,它可能会挂断脚本并抛出错误。 如果任何返回的布尔值为false,则应转到
removeEntities
,该操作将删除存在的实体


有什么更好的解决方案吗?

您可以依赖
|
的短路行为:

if (!await spawnEntities() 
  ||!await goToLocation()
  ||!await goToPed()
  ||!await goToBase()) {
    removeEntities();
}
它当然更容易阅读

对于
runChecks()
问题,您可以执行以下操作:

bool allChecksAreGood;
Vector3 targetLocation;

//you will get a warning on the next line the "=" is intentional
if (allChecksAreGood = runCheck()) {
    targetLocation = Game.PlayerPed.Position;
    officer1.Task.DriveTo(targetLocation);
}

if (allChecksAreGood && (allChecksAreGood = runCheck()){
    while (!policeCar.IsInRangeOf(targetLocation, 50.0f) || !runCheck()) {
        await Delay(500);
    }
}

return allChecksAreGood && runCheck();

注意,我稍微改变了您的逻辑,我假设如果
goToBase()
失败,您可能希望
removeenties()
。如果没有,则很容易修复。

您可以依赖
|
的短路行为:

if (!await spawnEntities() 
  ||!await goToLocation()
  ||!await goToPed()
  ||!await goToBase()) {
    removeEntities();
}
它当然更容易阅读

对于
runChecks()
问题,您可以执行以下操作:

bool allChecksAreGood;
Vector3 targetLocation;

//you will get a warning on the next line the "=" is intentional
if (allChecksAreGood = runCheck()) {
    targetLocation = Game.PlayerPed.Position;
    officer1.Task.DriveTo(targetLocation);
}

if (allChecksAreGood && (allChecksAreGood = runCheck()){
    while (!policeCar.IsInRangeOf(targetLocation, 50.0f) || !runCheck()) {
        await Delay(500);
    }
}

return allChecksAreGood && runCheck();

注意,我稍微改变了您的逻辑,我假设如果
goToBase()
失败,您可能希望
removeenties()
。如果没有,就很容易修复。

啊,这太好了!是的,我希望
removeenties
最终运行。比使用
goto
要好得多,尤其是在
async
方法中。当然,这更清楚,但是如果(!runCheck())返回false,那么
方法内部?有没有什么方法可以在方法内部不断运行它并返回false?啊,这会很好!是的,我希望
removeenties
最终运行。比使用
goto
要好得多,尤其是在
async
方法中。当然,这更清楚,但是如果(!runCheck())返回false,那么
方法内部?是否有任何方法可以在方法内部不断运行它并返回false?如果(!runCheck())返回false,您是否试图摆脱
语句?它们很棘手,因为它们会导致当前函数返回-您无法真正封装该行为,这是我的主要问题。。。我认为有一些神奇的方法可以让它
runCheck()
昂贵吗?如果没有,您可以
If(runCheck()){Vector3 targetLocation=Game.PlayerPed.Position;officer1.Task.DriveTo(targetLocation);}
等等。最后一个可以简化为
returnruncheck()否,它只运行空检查。将尝试一下。如果(!runCheck())返回false,您是否正在尝试摆脱
语句?它们很棘手,因为它们会导致当前函数返回-您无法真正封装该行为,这是我的主要问题。。。我认为有一些神奇的方法可以让它
runCheck()
昂贵吗?如果没有,您可以
If(runCheck()){Vector3 targetLocation=Game.PlayerPed.Position;officer1.Task.DriveTo(targetLocation);}
等等。最后一个可以简化为
returnruncheck()否,它只运行空检查。我会试试看。