Exemple #1
0
        // Use this for initialization
        void Start()
        {
            Application.targetFrameRate = 60;

            Debug.Log("Set frame rate to 60fps");

            ParallelTaskCollection pt = new ParallelTaskCollection();
            SerialTaskCollection   st = new SerialTaskCollection();

            st.Add(Print("s1"));
            st.Add(DoSomethingAsynchonously());
            st.Add(Print("s3"));

            pt.Add(Print("1"));
            pt.Add(Print("2"));
            pt.Add(Print("3"));
            pt.Add(Print("4"));
            pt.Add(Print("5"));
            pt.Add(st);
            pt.Add(Print("6"));
            pt.Add(WWWTest());
            pt.Add(Print("7"));
            pt.Add(Print("8"));

            pt.onComplete += () =>
            {
                Application.targetFrameRate = -1;
                Debug.Log("Unlock framerate");
            };

            pt.Run();
        }
        IEnumerator <TaskContract?> RunTasks(float timeout)
        {
            var enumerator = GetURLAsynchronously();

            //wait for one second (simulating async load)
            yield return(enumerator.Continue());

            string url = (string)enumerator.Current.Value.reference;

            var parallelTasks = new ParallelTaskCollection();

            //parallel tasks with race condition (timeout Breaks it)
            parallelTasks.Add(BreakOnTimeOut(timeout));
            parallelTasks.Add(new LoadSomething(new UnityWebRequest(url)).GetEnumerator());

            yield return(parallelTasks.Continue());

            if ((Break)parallelTasks.Current == Break.It)
            {
                yield return(Break.AndStop);

                throw new Exception("should never get here");
            }

            yield return(new WaitForSecondsEnumerator(2).Continue());
        }
Exemple #3
0
        IEnumerator RunTasks(float timeout)
        {
            var enumerator = GetURLAsynchronously();

            //wait for one second (simulating async load)
            yield return(enumerator);

            string url = (enumerator.Current as ValueObject <string>).target as string;

            var parallelTasks = new ParallelTaskCollection();

            //parallel tasks with race condition (timeout Breaks it)
            parallelTasks.Add(BreakOnTimeOut(timeout));
            parallelTasks.Add(new LoadSomething(new WWW(url)).GetEnumerator());

            yield return(parallelTasks);

            if (parallelTasks.Current.current == Break.It)
            {
                yield return(Break.AndStop);

                throw new Exception("should never get here");
            }

            yield return(new WaitForSecondsEnumerator(2));
        }
Exemple #4
0
        IEnumerator InitialSpawning()
        {
            var loadTasks = new ParallelTaskCollection();

            loadTasks.Add(_shipDefinition.Prefab.LoadAssetTask <GameObject>());
            loadTasks.Add(_shipDefinition.MerchantSprite.LoadAssetTask <Sprite>());
            loadTasks.Add(_shipDefinition.PirateSprite.LoadAssetTask <Sprite>());
            foreach (var sprite in _shipDefinition.ShipSprites)
            {
                loadTasks.Add(sprite.LoadAssetTask <Sprite>());
            }

            yield return(loadTasks);

            for (var i = 0; i < _spawnPoints.Length; i++)
            {
                Spawn((uint)i, _spawnPoints[i], i == 0 ? ShipControl.Player : ShipControl.Ai);
            }
        }
        // Use this for initialization
        void Start()
        {
            ParallelTaskCollection pt = new ParallelTaskCollection();
            SerialTaskCollection   st = new SerialTaskCollection();

            st.Add(Print("s1"));
            st.Add(Print("s2"));
            st.Add(Print("s3"));
            st.Add(Print("s4"));

            pt.Add(Print("p1")).Add(Print("p2"));
            pt.Add(new LoadSomething(new WWWEnumerator(new WWW("www.google.com")))); //obviously the token could be passed by constructor, but in some complicated situations, this is not possible (usually while exploiting continuation)
            pt.Add(new LoadSomething(new WWWEnumerator(new WWW("http://download.thinkbroadband.com/5MB.zip"))));
            pt.Add(new LoadSomething(new WWWEnumerator(new WWW("www.ebay.com"))));

            pt.Add(Print("p3")).Add(Print("p4")).Add(st).Add(Print("p5")).Add(Print("p6")).Add(Print("p7"));

            TaskRunner.Instance.RunOnSchedule(MTRunner, pt); //running on another thread!
        }
Exemple #6
0
    public IEnumerator TestUnityWaitInParallel()
    {
        var updateMonoRunner = new UpdateMonoRunner("test1");
        ITaskRoutine <IEnumerator> taskRoutine = TaskRunner.Instance.AllocateNewTaskRoutine(updateMonoRunner);
        ParallelTaskCollection     pt          = new ParallelTaskCollection();

        pt.Add(new WaitForSecondsUnity().GetEnumerator());
        pt.Add(new WaitForSecondsUnity().GetEnumerator());
        taskRoutine.SetEnumerator(pt);
        taskRoutine.Start();
        DateTime then = DateTime.Now;

        while (taskRoutine.isRunning == true)
        {
            yield return(null);
        }
        updateMonoRunner.Dispose();
        var totalSeconds = (DateTime.Now - then).TotalSeconds;

        Assert.That(totalSeconds, Is.InRange(0.9, 1.1));
    }
        /// <summary>
        /// Add can be called by another thread, so if the collection is already running
        /// I can't allow adding more tasks.
        /// </summary>
        /// <param name="enumerator"></param>
        /// <exception cref="MultiThreadedParallelTaskCollectionException"></exception>
        public void Add(IEnumerator enumerator)
        {
            if (isRunning == true)
            {
                throw new MultiThreadedParallelTaskCollectionException("can't add tasks on a started MultiThreadedParallelTaskCollection");
            }

            ParallelTaskCollection parallelTaskCollection = _parallelTasks[_numberOfTasksAdded++ % _parallelTasks.Length];

            parallelTaskCollection.Add(enumerator);

            _numberOfConcurrentOperationsToRun = Math.Min(_parallelTasks.Length, _numberOfTasksAdded);
        }
Exemple #8
0
        IEnumerator ResetTaskAndRun() //this is the suggested why to reset complicated tasks
        {
            st.Clear();
            pt.Clear();

            st.Add(Print("s1"));
            st.Add(Print("s2"));
            st.Add(Print("s3"));
            st.Add(Print("s4"));

            pt.Add(Print("p1"));
            pt.Add(Print("p2"));
            pt.Add(Print("p3"));
            pt.Add(Print("p4"));
            pt.Add(Print("p5"));
            pt.Add(st);
            pt.Add(Print("p6"));
            pt.Add(WWWTest());
            pt.Add(Print("p7"));
            pt.Add(Print("p8"));

            return(pt);
        }
Exemple #9
0
    public static ParallelTaskCollection Combine(this IEnumerator enumerator, IEnumerator enumerator2)
    {
        var parallel = enumerator as ParallelTaskCollection;

        if (parallel == null)
        {
            parallel = new ParallelTaskCollection();
            parallel.Add(enumerator);
        }

        parallel.Add(enumerator2);

        return(parallel);
    }
    // Use this for initialization
    void Start()
    {
        var someData = new SomeData();

        var pt = new ParallelTaskCollection <SomeData>(someData);
        var st = new SerialTaskCollection <SomeData>(someData);

        st.Add(Print("s1"));
        st.Add(Print("s2"));
        st.Add(pt);
        st.Add(Print("s3"));
        st.Add(Print("s4"));

        pt.Add(Print("1"));
        pt.Add(Print("2"));
        pt.Add(DoSomethingAsynchonously());
        pt.Add(new LoadSomething(new WWW("www.google.com"))); //obviously the token could be passed by constructor, but in some complicated situations, this is not possible (usually while exploiting continuation)
        pt.Add(new LoadSomething(new WWW("http://download.thinkbroadband.com/5MB.zip")));
        pt.Add(new LoadSomething(new WWW("www.ebay.com")));
        pt.Add(Print("3"));
        pt.Add(Print("4"));
        pt.Add(Print("5"));
        pt.Add(Print("6"));
        pt.Add(Print("7"));
        pt.Add(Print(someData.justForTest.ToString()));

        TaskRunner.Instance.Run(st);
    }
        // Use this for initialization
        void Start()
        {
            var pt = new ParallelTaskCollection();
            var st = new SerialTaskCollection();

            st.Add(Print("s1"));
            st.Add(Print("s2"));
            st.Add(pt);
            st.Add(Print("s3"));
            st.Add(Print("s4"));

            pt.Add(Print("1"));
            pt.Add(Print("2"));

            //only the task runner can actually handle parallel tasks
            //that return Unity operations (when unity compatible
            //schedulers are used)
            pt.Add(UnityAsyncOperationsMustNotBreakTheParallelism());
            pt.Add(UnityYieldInstructionsMustNotBreakTheParallelism());

            pt.Add(new LoadSomething(new UnityWebRequest("www.google.com")).GetEnumerator()); //obviously the token could be passed by constructor, but in some complicated situations, this is not possible (usually while exploiting continuation)
            pt.Add(new LoadSomething(new UnityWebRequest("http://download.thinkbroadband.com/5MB.zip")).GetEnumerator());
            pt.Add(new LoadSomething(new UnityWebRequest("www.ebay.com")).GetEnumerator());
            pt.Add(Print("3"));
            pt.Add(Print("4"));
            pt.Add(Print("5"));
            pt.Add(Print("6"));
            pt.Add(Print("7"));

            st.Start();
        }