C# для l oop никогда не выполняется из потока или асин c метод - PullRequest
1 голос
/ 18 февраля 2020

У меня есть довольно простой c блок кода, который мне нужно запустить в отдельном потоке или в асинхронном режиме c, так как он должен ждать некоторое время каждый l oop, пока он не породит все ящики из массива.

Я пробовал так много техник, которые, кажется, работают везде, но я ошеломлен своей ошибкой.

Когда я удаляю нити и асин c и запускаю для l oop без задержек, это работает, но так как нет никаких задержек, я получаю каскад летающих коробок. Это не будет делать.

Проще говоря, мне нужно подождать 'некоторое время' каждый для l oop, прежде чем создать следующий блок, чтобы позволить текущему блоку сойти с дороги. Я хочу сделать это, не блокируя основной поток. Однако, когда я использую многопоточность или asyn c, for для l oop просто никогда не выполняется.

Кто-нибудь видит что-нибудь, что указывало бы, почему оно не выполняется? Моя отладка подтверждает, что мой список ящиков при запуске не пуст, что означает, что for l oop соответствует требованиям для выполнения.

Вот мой код:

    public void HandleBoxSpawnThread() {
        ThreadPool.QueueUserWorkItem(ImportBoxSpawn);
    }

    public void ImportBoxSpawn(object state) {

        Debug.Log("Spawning!");
        Debug.Log("Count: "+readFromList.finalBoxList.Count);
        for (int i = 0; i < readFromList.finalBoxList.Count; i++) { 
            geniLoc = GeniEntrance.position;
            geniLoc += new Vector3(UnityEngine.Random.Range(-0.5f, 0.5f), 2, 2);
            float width = readFromList.finalBoxList[i].w;
            float length = readFromList.finalBoxList[i].l;
            width = width/39.3701f;
            length = length/39.3701f;
            float height = UnityEngine.Random.Range(0.3f,0.5f)*length;//Random.Range(0.0762f, 0.762f)
            Box_random.transform.localScale = new Vector3(width,height,length);
            Box_random.GetComponent<Rigidbody>().mass = (length*width*height)*50;
            Instantiate(Box_random, geniLoc, Quaternion.identity,myGeniParent);
            Debug.Log("Spawning Box "+i+".");
            Thread.Sleep(1000);
            Debug.Log("End");
        }
    }

EDIT: После некоторых дополнительных отладок и исследований выясняется, что использование преобразований ...

geniLoc = GeniEntrance.position;

... не работает в отдельных потоках в Unity3D. Я переключился на использование сопрограммы и получил поведение, которое я хотел. Поскольку это не сложный расчет или что-то, что я ожидаю много раз, я не так обеспокоен стоимостью выполнения. В более сложных ситуациях, когда происходит много вычислений, правильным решением будет обратный вызов основного потока для управления преобразованиями из второго потока. Спасибо всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...