+ static void Worker (object x) {
+ Thread.Sleep (100000);
+ }
+
+ public static void invoke_workers () {
+ for (int i = 0; i < 1; i ++)
+ ThreadPool.QueueUserWorkItem (Worker);
+ }
+
+ public static int test_0_unload_with_threadpool () {
+ AppDomain domain = AppDomain.CreateDomain ("test_0_unload_with_threadpool");
+
+ domain.DoCallBack (new CrossAppDomainDelegate (invoke_workers));
+ AppDomain.Unload (domain);
+
+ return 0;
+ }
+
+ /*
+ * This test is not very deterministic since the thread which enqueues
+ * the work item might or might not be inside the domain when the unload
+ * happens. So disable this for now.
+ */
+ /*
+ public static void DoUnload (object state) {
+ AppDomain.Unload (AppDomain.CurrentDomain);
+ }
+
+ public static void Callback () {
+ Console.WriteLine (AppDomain.CurrentDomain);
+ WaitCallback unloadDomainCallback = new WaitCallback (DoUnload);
+ ThreadPool.QueueUserWorkItem (unloadDomainCallback);
+ }
+
+ public static int test_0_unload_inside_appdomain_async () {
+ AppDomain domain = AppDomain.CreateDomain ("Test3");
+
+ domain.DoCallBack (new CrossAppDomainDelegate (Callback));
+
+ return 0;
+ }
+ */
+
+ public static void SyncCallback () {
+ AppDomain.Unload (AppDomain.CurrentDomain);
+ }
+
+ public static int test_0_unload_inside_appdomain_sync () {
+ AppDomain domain = AppDomain.CreateDomain ("Test3");
+
+ try {
+ domain.DoCallBack (new CrossAppDomainDelegate (SyncCallback));
+ }
+ catch (Exception ex) {
+ /* Should throw a ThreadAbortException */
+ Thread.ResetAbort ();
+ }
+
+ return 0;
+ }
+