如何在继续异步线程之前等待 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
我在这里想要实现的是让线程在 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