示例#1
0
        public void CtorWithAttributes()
        {
            TestRuntime.AssertXcodeVersion(8, 0);

            using (var queue = new DispatchQueue("1", new DispatchQueue.Attributes
            {
                AutoreleaseFrequency = DispatchQueue.AutoreleaseFrequency.Inherit,
            }))
            {
                Assert.AreNotEqual(IntPtr.Zero, queue.Handle, "Handle 1");
            }

            using (var queue = new DispatchQueue("2", new DispatchQueue.Attributes
            {
                IsInitiallyInactive = true,
            }))
            {
                queue.Activate();                  // must activate the queue before it can be released according to Apple's documentation
                Assert.AreNotEqual(IntPtr.Zero, queue.Handle, "Handle 2");
            }

            using (var queue = new DispatchQueue("3", new DispatchQueue.Attributes
            {
                QualityOfService = DispatchQualityOfService.Utility,
            }))
            {
                Assert.AreNotEqual(IntPtr.Zero, queue.Handle, "Handle 3");
                Assert.AreEqual(DispatchQualityOfService.Utility, queue.QualityOfService, "QualityOfService 3");
            }

            using (var target_queue = new DispatchQueue("4 - target")) {
                using (var queue = new DispatchQueue("4", new DispatchQueue.Attributes
                {
                    QualityOfService = DispatchQualityOfService.Background,
                    AutoreleaseFrequency = DispatchQueue.AutoreleaseFrequency.WorkItem,
                    RelativePriority = -1,
                }, target_queue))
                {
                    Assert.AreNotEqual(IntPtr.Zero, queue.Handle, "Handle 4");
                    Assert.AreEqual(DispatchQualityOfService.Background, queue.GetQualityOfService(out var relative_priority), "QualityOfService 4");
                    Assert.AreEqual(-1, relative_priority, "RelativePriority 4");
                }
            }
        }
示例#2
0
        public void Wait_DispatchTime()
        {
            TestRuntime.AssertXcodeVersion(8, 0);

            var called   = false;
            var callback = new Action(() => called = true);

            using (var db = new DispatchBlock(callback)) {
                using (var queue = new DispatchQueue("Background")) {
                    queue.Activate();
                    var rv = db.Wait(new DispatchTime(DispatchTime.Now, TimeSpan.FromSeconds(0.1)));
                    Assert.AreNotEqual(0, rv, "Timed Out");

                    queue.DispatchAsync(db);
                    rv = db.Wait(new DispatchTime(DispatchTime.Now, TimeSpan.FromSeconds(5)));
                    Assert.AreEqual(0, rv, "Timed Out 2");
                    Assert.IsTrue(called, "Called");
                }
            }
        }
示例#3
0
        public void Create()
        {
            TestRuntime.AssertXcodeVersion(8, 0);

            var called   = false;
            var callback = new Action(() => called = true);
            DispatchBlockFlags flags;

            Assert.Throws <ArgumentNullException> (() => DispatchBlock.Create(null), "ANE 1");
            Assert.Throws <ArgumentNullException> (() => DispatchBlock.Create(null, DispatchBlockFlags.AssignCurrent), "ANE 2");
            Assert.Throws <ArgumentNullException> (() => DispatchBlock.Create((Action)null, DispatchBlockFlags.AssignCurrent, DispatchQualityOfService.Background, 2), "ANE 3");
            Assert.Throws <ArgumentNullException> (() => DispatchBlock.Create((DispatchBlock)null, DispatchBlockFlags.AssignCurrent, DispatchQualityOfService.Background, 2), "ANE 4");
            // Invalid input results in NULL and an exception
            Assert.Throws <Exception> (() => DispatchBlock.Create(callback, (DispatchBlockFlags)12345678), "E 1");
            Assert.Throws <Exception> (() => DispatchBlock.Create(callback, (DispatchBlockFlags)12345678, DispatchQualityOfService.UserInteractive, 0), "E 2");
            Assert.Throws <Exception> (() => DispatchBlock.Create(callback, DispatchBlockFlags.None, (DispatchQualityOfService)12345678, 0), "E 3");
            Assert.Throws <Exception> (() => DispatchBlock.Create(callback, DispatchBlockFlags.None, DispatchQualityOfService.Default, 12345678), "E 4");

            called = false;
            using (var db = DispatchBlock.Create(callback)) {
                using (var queue = new DispatchQueue("Background")) {
                    queue.Activate();
                    queue.DispatchAsync(db);
                    var rv = db.Wait(new DispatchTime(DispatchTime.Now, TimeSpan.FromSeconds(5)));
                    Assert.AreEqual(0, rv, "Timed Out A");
                    Assert.IsTrue(called, "Called A");
                }
            }

            called = false;
            flags  = DispatchBlockFlags.None;
            using (var db = DispatchBlock.Create(callback, flags)) {
                using (var queue = new DispatchQueue("Background")) {
                    queue.Activate();
                    queue.DispatchAsync(db);
                    var rv = db.Wait(new DispatchTime(DispatchTime.Now, TimeSpan.FromSeconds(5)));
                    Assert.AreEqual(0, rv, "Timed Out " + flags);
                    Assert.IsTrue(called, "Called " + flags);
                }
            }

            called = false;
            flags  = DispatchBlockFlags.AssignCurrent;
            using (var db = DispatchBlock.Create(callback, flags)) {
                using (var queue = new DispatchQueue("Background")) {
                    queue.Activate();
                    queue.DispatchAsync(db);
                    var rv = db.Wait(new DispatchTime(DispatchTime.Now, TimeSpan.FromSeconds(5)));
                    Assert.AreEqual(0, rv, "Timed Out " + flags);
                    Assert.IsTrue(called, "Called " + flags);
                }
            }


            called = false;
            flags  = DispatchBlockFlags.Detached;
            using (var db = DispatchBlock.Create(callback, flags)) {
                using (var queue = new DispatchQueue("Background")) {
                    queue.Activate();
                    queue.DispatchAsync(db);
                    var rv = db.Wait(new DispatchTime(DispatchTime.Now, TimeSpan.FromSeconds(5)));
                    Assert.AreEqual(0, rv, "Timed Out " + flags);
                    Assert.IsTrue(called, "Called " + flags);
                }
            }

            called = false;
            flags  = DispatchBlockFlags.Detached;
            using (var db = DispatchBlock.Create(callback, flags, DispatchQualityOfService.Background, -8)) {
                using (var queue = new DispatchQueue("Background")) {
                    queue.Activate();
                    queue.DispatchAsync(db);
                    var rv = db.Wait(new DispatchTime(DispatchTime.Now, TimeSpan.FromSeconds(5)));
                    Assert.AreEqual(0, rv, "Timed Out Background 8" + flags);
                    Assert.IsTrue(called, "Called Background 8" + flags);
                }
            }

            called = false;
            flags  = DispatchBlockFlags.Detached;
            using (var db = DispatchBlock.Create(callback, flags, DispatchQualityOfService.Background, -8)) {
                using (var db2 = db.Create(DispatchBlockFlags.EnforceQosClass, DispatchQualityOfService.Unspecified, -7)) {
                    using (var queue = new DispatchQueue("Background")) {
                        queue.Activate();
                        queue.DispatchAsync(db2);
                        var rv = db2.Wait(new DispatchTime(DispatchTime.Now, TimeSpan.FromSeconds(5)));
                        Assert.AreEqual(0, rv, "Timed Out Background DB" + flags);
                        Assert.IsTrue(called, "Called Background DB" + flags);
                    }
                }
            }
        }