예제 #1
0
        static void RunScenario(AutoResetEvent evt)
        {
            IntPtr obj    = ObjectiveC.initObject();
            var    thread = new Thread(_ =>
            {
                ObjectiveC.autoreleaseObject(obj);
                evt.Set();
            });

            thread.Start();

            evt.WaitOne();
            thread.Join();
        }
예제 #2
0
    private static void ValidateNewManagedThreadAutoRelease()
    {
        Console.WriteLine($"Running {nameof(ValidateNewManagedThreadAutoRelease)}...");
        using (AutoResetEvent evt = new AutoResetEvent(false))
        {
            int numReleaseCalls = ObjectiveC.getNumReleaseCalls();

            RunScenario(evt);

            // Trigger the GC and wait to clean up the allocated managed Thread instance.
            GC.Collect();
            GC.WaitForPendingFinalizers();

            Assert.AreEqual(numReleaseCalls + 1, ObjectiveC.getNumReleaseCalls());
        }
예제 #3
0
 private static void TestAutoRelease()
 {
     using (AutoResetEvent evt = new AutoResetEvent(false))
     {
         int    numReleaseCalls = ObjectiveC.getNumReleaseCalls();
         IntPtr obj             = ObjectiveC.initObject();
         ThreadPool.QueueUserWorkItem(_ =>
         {
             ObjectiveC.autoreleaseObject(obj);
             evt.Set();
         });
         evt.WaitOne();
         // Wait 60 ms after the signal to ensure that the thread has finished the work item and has drained the thread's autorelease pool.
         Thread.Sleep(60);
         Assert.AreEqual(numReleaseCalls + 1, ObjectiveC.getNumReleaseCalls());
     }
 }