等待Task.Delay(1000);导致崩溃 - Unity C#
await Task.Delay(1000); causing crashes - Unity C#
主要问题:
不确定后台发生了什么,但显然每当调用 await Task.Delay(1000);
行时,Unity 都会打开 unresponsive/freezes。
错误信息:
尝试从 unity 的分析器检查回调,但每当触发相关行时,unity 会立即变得无响应并且不允许任何交互(也没有发出 callbacks/error 消息)。
目标:
这里的目标是简单地调用 tryActivities[0]
然后,等待 1 秒然后 return 为真,并打印“钓鱼成功!”,没有任何崩溃。
怀疑:
我怀疑 tryActivities.Add(new Func<bool>(() => fs(currentSlot.basicData.typeID).Result));
行需要某种等待?虽然我也不确定如何实现它。
盘点盘点; (Inventory.cs)
List<Func<bool>> tryActivities = new List<Func<bool>>();
public delegate Task<bool> Fish(int ID); Fish fs;
void Start()
{
fs = new Fish(activities.Fish);
tryActivities.Add(new Func<bool>(() => fs(currentSlot.basicData.typeID).Result));//await? how?
}
public void Interact()//called when a button is pressed
{
if (TryPlaceOrUse()) print("Fished successfully!");
else print("Fishing failed");
}
bool TryPlaceOrUse()
{
if (tryActivities[(int)currentSlot.basicData.myActivity]())//tryActivities[0]
return true;
return false;
}
活动活动; (Activities.cs)
public async Task<bool> Fish(int ID)
{
await Task.Delay(1000);//crashes here
return true;
}
这可能会如您所愿。这就是您使用 async
Func
列表的方式,它实际上只是 Func
列表 return Task
列表 bool
.
public class Program
{
public delegate Task<bool> Fish(int ID);
Fish fs;
List<Func<Task<bool>>> tryActivities = new List<Func<Task<bool>>>();
public async static Task Main()
{
Console.WriteLine("Hello, World!");
Program program = new Program();
program.Start();
await program.Interact();
}
void Start()
{
fs = new Fish(Activities.Fish);
tryActivities.Add(new Func<Task<bool>>(async () => await fs(4)));//await? how? like this :)
}
public async Task Interact() //called when a button is pressed
{
if (await TryPlaceOrUse())
Console.WriteLine("Fished successfully!");
else
Console.WriteLine("Fishing failed");
}
async Task<bool> TryPlaceOrUse()
{
if (await tryActivities[0]()) //tryActivities[0]
return true;
return false;
}
}
public class Activities
{
public static async Task<bool> Fish(int ID)
{
await Task.Delay(1000);//does not crash here
return true;
}
}
主要问题:
不确定后台发生了什么,但显然每当调用 await Task.Delay(1000);
行时,Unity 都会打开 unresponsive/freezes。
错误信息: 尝试从 unity 的分析器检查回调,但每当触发相关行时,unity 会立即变得无响应并且不允许任何交互(也没有发出 callbacks/error 消息)。
目标:
这里的目标是简单地调用 tryActivities[0]
然后,等待 1 秒然后 return 为真,并打印“钓鱼成功!”,没有任何崩溃。
怀疑:
我怀疑 tryActivities.Add(new Func<bool>(() => fs(currentSlot.basicData.typeID).Result));
行需要某种等待?虽然我也不确定如何实现它。
盘点盘点; (Inventory.cs)
List<Func<bool>> tryActivities = new List<Func<bool>>();
public delegate Task<bool> Fish(int ID); Fish fs;
void Start()
{
fs = new Fish(activities.Fish);
tryActivities.Add(new Func<bool>(() => fs(currentSlot.basicData.typeID).Result));//await? how?
}
public void Interact()//called when a button is pressed
{
if (TryPlaceOrUse()) print("Fished successfully!");
else print("Fishing failed");
}
bool TryPlaceOrUse()
{
if (tryActivities[(int)currentSlot.basicData.myActivity]())//tryActivities[0]
return true;
return false;
}
活动活动; (Activities.cs)
public async Task<bool> Fish(int ID)
{
await Task.Delay(1000);//crashes here
return true;
}
这可能会如您所愿。这就是您使用 async
Func
列表的方式,它实际上只是 Func
列表 return Task
列表 bool
.
public class Program
{
public delegate Task<bool> Fish(int ID);
Fish fs;
List<Func<Task<bool>>> tryActivities = new List<Func<Task<bool>>>();
public async static Task Main()
{
Console.WriteLine("Hello, World!");
Program program = new Program();
program.Start();
await program.Interact();
}
void Start()
{
fs = new Fish(Activities.Fish);
tryActivities.Add(new Func<Task<bool>>(async () => await fs(4)));//await? how? like this :)
}
public async Task Interact() //called when a button is pressed
{
if (await TryPlaceOrUse())
Console.WriteLine("Fished successfully!");
else
Console.WriteLine("Fishing failed");
}
async Task<bool> TryPlaceOrUse()
{
if (await tryActivities[0]()) //tryActivities[0]
return true;
return false;
}
}
public class Activities
{
public static async Task<bool> Fish(int ID)
{
await Task.Delay(1000);//does not crash here
return true;
}
}