等待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;
    }
}