38872


現在、UnityとHololensの開発しているのすが、自分のコードで問題が出て、何が間違えてるかわからないからどなたか助けて頂けたらありがたいです。

後でコードで見れるけど基本的にOsoiSagyoという関数がある。この関数はForループで１０００回の２ｍｓの待つ。すなわちOsoiSagyoは２秒にかかるはずです。

コードは以下

[code]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    
    #if !UNITY_EDITOR && UNITY_WSA
    using System.Threading.Tasks;
    #endif
    
    
    public class ExampleScript : MonoBehaviour {
    
        void Start () {
            Debug.Log("Start():: Starting");
    
          #if !UNITY_EDITOR && UNITY_WSA
    
          //ここに同期か非同期も試してみよう
          //  Task.Run( ()=>OsoiSagyo()   );
         //Task.Run( async ()=>OsoiSagyo()   ); //これ？
           OsoiSagyo();  //Blocking
    
    　　　#endif
            Debug.Log("Start():: Done");
        }
    
    
        void OsoiSagyo()
        {
            Debug.Log("ExampleScript::OsoiSagyo()  --Doing 1000 things , each taking 2ms");
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();
    
    
            for(int i=0;i<1000;i++)
            {
    
    #if !UNITY_EDITOR && UNITY_WSA
    
                //これを使うために関数は async　であるべき 
             //  await Task.Delay(2);
    
            //この方法？
           // Task.Delay(2).Wait();
    
           //それともこの方法
                WaitFor2MiliSeconds();
    #endif
    
       }
    
            sw.Stop();
    
            Debug.Log("ExampleScript::OsoiSagyo() --Done! Elapsed Time:" + sw.ElapsedMilliseconds / 1000f);
    
        }
    
    #if !UNITY_EDITOR && UNITY_WSA
         private async void WaitFor2MiliSeconds()
        {
     //        await System.Threading.Tasks.Task.Delay(2);
             await System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(2.0));
    
         }
    
    #endif
    
    }
    
[/code]

このプログラムの結果は

  1. もし`Task.Delay(2).Wait` を利用したら２秒ではなくて１５秒をかかる！！
  2. もし`WaitFor2MiliSeconds()`で`await Task.Delay()`を利用したら２秒ではなくて０．２秒（同期）それか０．４秒（非同期）にかかる。

確かに私のDelayの使い方は間違ってると思いますが２秒かかるために（非同期と同期でも）どう書いたらいいでしょうか？

どうぞよろしくお願いいたします。

* * *

念のために書くけど`#if !UNITY_EDITOR &&
UNITY_WSA`は関係なくてUnityはTaskを使うためにのことです。気になったら説明しますけどこの質問は関係ないだと思います


CC BY-SA 3.0
2017-10-19T05:21:30.523
38854
2017-10-19T13:57:03.630
25827
question
c# unity3d 非同期 マルチスレッド
Task.Delayの遅れは正しくないです。


[Task.Delay](https://docs.microsoft.com/en-
us/dotnet/api/system.threading.tasks.task.delay?view=netframework-4.7.1#System_Threading_Tasks_Task_Delay_System_Int32_)は

> This method depends on the system clock. This means that the time delay will
> approximately equal the resolution of the system clock if the
> `millisecondsDelay` argument is less than the resolution of the system
> clock, which is approximately 15 milliseconds on Windows systems.

と説明されているように、分解能依存であり、小さな値を指定したからと言って希望通りの動作をするわけではないことが明言されています。Windowsであれば分解能は15ミリ秒であり、1000回実行すればおよそ15秒になります。


CC BY-SA 3.0
2017-10-19T13:57:03.630
38872
2017-10-19T13:57:03.630
4236
38854
answer