巫人 发表于 2021-8-14 11:22

C#async&await有关的执行顺序导致的错误

本帖最后由 巫人 于 2021-8-14 11:29 编辑

请问await是要等待所有主线程的代码执行完毕后再执行么?
static SearchOperation()
{
    Initialize();
}

internal static async void Initialize()
{
    var dictionary = await ReadLocalJson<Dictionary<string, List<Dictionary<string, string>>>>(
    RuntimePlatform.WindowsPlayer, Application.streamingAssetsPath + "/Config/Path.json");
    ListConfig = dictionary["AllConfigPath"];
}

internal static async Task<T> ReadLocalJson<T>(RuntimePlatform platform, string url) where T : ICollection
{
    UnityWebRequest unityWebRequest = UnityWebRequest.Get(GetLocalUrl(platform, url));
    await unityWebRequest.SendWebRequest();
    if (unityWebRequest.result == UnityWebRequest.Result.ProtocolError ||unityWebRequest.result == UnityWebRequest.Result.ConnectionError)
    {
      Debug.Log("error=" + unityWebRequest.error);
      throw new Exception("读取JSON文件出错");
    }
    var dictionary = JsonMapper.ToObject<T>(unityWebRequest.downloadHandler.text);
    return dictionary;
}
//使用代码
//ReadUIJson=ReadLocalJson

UIModelCollection.Instance.ReadUIJson(RuntimePlatform.WindowsPlayer,

Application.streamingAssetsPath + "/Config/UIModelConfig/UIPrefabs.json");

GameObject go = Instantiate(UIModelCollection.Instance.LoadGameObject("Button.prefab"));

go.name = "1111";

我这样使用的话他会先遍历ListConfig导致报空错误,就是ReadLocalJson还没执行完就执行了LoadGameObject这个函数,LoadGameObject里做遍历ListConfig操作,结果就是报空错误,请问怎么解决呢?好烦搞了好几天了

如果我后面的遍历ListConfig操作稍等下再做,就能读取完毕,但是现在就得要求立即遍历ListConfig

wtujoxk 发表于 2021-8-14 11:46

异步改同步

巫人 发表于 2021-8-14 12:14

wtujoxk 发表于 2021-8-14 11:46
异步改同步

await unityWebRequest.SendWebRequest();这句必须是异步,同步会暂停卡死,,初始化也得异步,不然也卡死

小白来袭2 发表于 2021-8-14 12:47

你这代码也看不出来啊

Cool_Breeze 发表于 2021-8-14 14:18

就是ReadLocalJson还没执行完【 等待 它执行完成后task.wiat】执行 LoadGameObject这个函数,

wangsheng66 发表于 2021-8-14 14:27

获取到Initialize的Task对象,在ContinueWith中执行LoadGameObject等方法。

细水流长 发表于 2021-8-14 16:01

wtujoxk 发表于 2021-8-14 17:18

用 Task.Run 改

巫人 发表于 2021-8-15 09:43

wangsheng66 发表于 2021-8-14 14:27
获取到Initialize的Task对象,在ContinueWith中执行LoadGameObject等方法。

这个不行,不知道什么原因还是会卡死{:301_971:}

巫人 发表于 2021-8-15 09:46

wtujoxk 发表于 2021-8-14 17:18
用 Task.Run 改

async&await看看这个?其实实现是一样的就是async语法简单
页: [1] 2
查看完整版本: C#async&await有关的执行顺序导致的错误