public class MyTask { public class MyEventArgs : EventArgs { public object EventData { get; private set; } public MyEventArgs(object eventData) { this.EventData = eventData; } } public event EventHandler<MyEventArgs> MyEvent; public void DoWork() { Console.WriteLine("Start"); var i = 0; while (i++ < 10) { Thread.Sleep(1000); var temp = this.MyEvent; if (temp != null) temp(this, new MyEventArgs("MyEvent(" + i.ToString() + ")")); } Console.WriteLine("End"); } } public static class NewAppDomain { /// <summary> /// 无参调用 /// </summary> /// <param name="action"></param> public static void Execute(Action action) { AppDomain domain = null; try { domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid()); var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap( typeof(AppDomainDelegate).Assembly.FullName, typeof(AppDomainDelegate).FullName); domainDelegate.Execute(action); } finally { if (domain != null) AppDomain.Unload(domain); } } /// <summary> /// 有参调用 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="parameter"></param> /// <param name="action"></param> public static void Execute<T>(T parameter, Action<T> action) { AppDomain domain = null; try { domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid()); var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap( typeof(AppDomainDelegate).Assembly.FullName, typeof(AppDomainDelegate).FullName); domainDelegate.Execute(parameter, action); } finally { if (domain != null) domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap( typeof(AppDomainDelegate).Assembly.FullName, typeof(AppDomainDelegate).FullName); return domainDelegate.Execute(action); } finally { if (domain != null) AppDomain.Unload(domain); } } /// <summary> /// 有返回值的有参调用 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="parameter"></param> /// <param name="action"></param> /// <returns></returns> public static TResult Execute<T, TResult>(T parameter, Func<T, TResult> action) { AppDomain domain = null; try { domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid()); var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap( typeof(AppDomainDelegate).Assembly.FullName, typeof(AppDomainDelegate).FullName); return domainDelegate.Execute(parameter, action); } finally { if (domain != null) AppDomain.Unload(domain); } } private class AppDomainDelegate : MarshalByRefObject { public void Execute(Action action) { action(); } public void Execute<T>(T parameter, Action<T> action) { action(parameter); } public T Execute<T>(Func<T> action) { return action(); } public TResult Execute<T, TResult>(T parameter, Func<T, TResult> action) { return action(parameter); } } }
Private void the Form1_Load ( Object SENDER, EventArgs E) { // 1. None None Return Value call reference, and cross-domain call event NewAppDomain.Execute (() => { var MyTask = new new to MyTask (); mytask.MyEvent + = new new the EventHandler <MyTask.MyEventArgs> (mytask_IndexChanged); mytask.DoWork (); }); // 2. there is no return of a call reference var dt = DateTime.Now.ToString (); NewAppDomain.Execute < String > (dt, args => { Console.WriteLine (args); }); // 3. There are no arguments to call the return value var Result = NewAppDomain.Execute (() => { return " HelloWorld " ;}); // 4. There have return of a call reference var Parameter = new new List < String > { " A " , " B " , " C " }; var result2 = NewAppDomain.Execute (Parameter, args => { return String .join ( " | " , args);}); } void mytask_IndexChanged(object sender, MyTask.MyEventArgs e) { Debug.Print("Event:" + e.EventData.ToString()); }