Task.Delayの遅れは正しくないです。
現在、UnityとHololensの開発しているのすが、自分のコードで問題が出て、何が間違えてるかわからないからどなたか助けて頂けたらありがたいです。
後でコードで見れるけど基本的にOsoiSagyoという関数がある。この関数はForループで1000回の2msの待つ。すなわちOsoiSagyoは2秒にかかるはずです。
コードは以下
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
}
このプログラムの結果は
- もし
Task.Delay(2).Wait
を利用したら2秒ではなくて15秒をかかる!! - もし
WaitFor2MiliSeconds()
でawait Task.Delay()
を利用したら2秒ではなくて0.2秒(同期)それか0.4秒(非同期)にかかる。
確かに私のDelayの使い方は間違ってると思いますが2秒かかるために(非同期と同期でも)どう書いたらいいでしょうか?
どうぞよろしくお願いいたします。
念のために書くけど#if !UNITY_EDITOR && UNITY_WSA
は関係なくてUnityはTaskを使うためにのことです。気になったら説明しますけどこの質問は関係ないだと思います