如何在继续异步线程之前等待 1 秒?

How to wait for 1 second before continuing async thread?

我在这里想要实现的是让线程在 FishData fishData = await Fishing().WaitOrCancel(cancelToken); 处等待,直到一个非空的 fishData 被 returned,否则就继续等待并每隔一段时间再次检查 TryHook() 1秒。

我也曾尝试用 Thread.Sleep() 替换 await Task.Delay(1000);,但它们似乎不起作用,而是继续导致崩溃。还尝试了 InvokeRepeating 和协同程序,但一切都变得太乱了,我什至不确定我是否正确实施了它们。

    public async Task<bool> Fish(int ID)
    {
        reelingSuccess = false;
        FishingRodData fishingRodData = inventory.fishingRods[ID];
        if (currentCell.fill == CellFill.Water)
        {
            CancellationToken cancelToken = new CancellationToken();
            try
            {
                FishData fishData = await Fishing().WaitOrCancel(cancelToken);
                bool reelSuccess = await ReelingFish(fishingRodData.cycleTime, fishingRodData.tolerance, fishData.cycles, fishData.hits).WaitOrCancel(cancelToken);//, fishData.speed
                if (reelSuccess) print("successfully reeled in fish");
                else print("failed reeling in fish! better luck next time!");
                inventory.interactBtn.onClick.RemoveAllListeners();
                inventory.interactBtn.onClick.AddListener(delegate { inventory.itrct(); });
            }
            catch (OperationCanceledException) { print("fishing has been cancelled!"); }
            return true;
        } return false;
    }

    async Task<FishData> Fishing()
    {
        **await Task.Delay(1000);**
        print("try hook");
        FishData fish = TryHook();
        if (fish == null) fish = await Fishing();
        return fish;
    }

ps: 原谅我的英文

编辑:这里是 TryHook 代码 它基本上是根据概率来捕鱼,这主要是 return 一个空值,但是一旦 Fishing() 中的 FishData fish = TryHook(); 每隔几次调用一次,它可能 return 一条鱼。

    FishData TryHook()
    {
        FishData fish = null;
        for (int i = 0; i < fishLs.Length; i++)
        {
            fishLs[i].minValue = inventory.fishes[i].minValue;
            fishLs[i].maxValue = inventory.fishes[i].maxValue;
            fishLs[i].probability = inventory.fishes[i].probability;
        }
        int index = GetRandomValue(fishLs);//get random index in fishLs but based on probability instead of Random.Range()
        if (index != -1) { print("caught fish ind: " + index); fish = inventory.fishes[index]; }
        return fish;
    }

EDIT2:不确定这是否重要,但这就是调用 Fish() 的方式。

    void Start()
    {
        itrct = new interact(Interact);
        fs = new Fish(activities.Fish);
        rf = new removeFront(RemoveFront);

        tryActivities.Add(new Func<bool>(() => activities.DoNothing()));
        //tryActivities.Add(new Func<bool>(() => activities.Fish(currentSlot.basicData.typeID).Result));
        tryActivities.Add(new Func<bool>(() => fs(currentSlot.basicData.typeID).Result));
        tryActivities.Add(new Func<bool>(() => activities.UseStove(currentSlot.basicData.typeID)));
    }

    public void Interact()//id of currently hold item
    {
        Debug.Log("interact");
        if (currentSlot != null && currentSlot.basicData.allID != -1 && TryPlaceOrUse())//check for hand activity
        {
            Debug.Log("successfully do in-hand activity");
        }
        else if (currentCell.objects.Count > 1 && currentCell.objects[^1].GetComponent<SpawnedObjectData>().allID != -1 &&
            tryActivities[(int)allBasicData[currentCell.objects[^1].GetComponent<SpawnedObjectData>().allID].myActivity]())//check activity infront
        {
            //await tryActivities[2];
            Debug.Log("successfully do in-front activity");
        }
        else Debug.Log("show emotes~ there's not hing to do ~~");
    }
async Task<FishData> Fishing()
{
    while(true)
    {
        await Task.Delay(1000);
        print("try hook");
        FishData fish = TryHook();
        if (fish != null) 
        {                
            return fish;
        } 
    }
}

然后:

var data = await Fishing();
// do what you want with your fish here