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) AppDomain.Unload(domain); } } /// <summary> /// 有返回值的无参调用 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="action"></param> /// <returns></returns> public static T Execute<T>(Func<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); 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> action) { return action(parameter); } } }
private void Form1_Load(object sender,EventArgs e) { //1.无参无返回值调用,兼跨域事件调用 NewAppDomain.Execute(() => { var mytask = new MyTask(); mytask.MyEvent += new EventHandler<MyTask.MyEventArgs>(mytask_IndexChanged); mytask.DoWork(); }); //2.有参无返回值调用 var dt = DateTime.Now.ToString(); NewAppDomain.Execute<string>(dt,args => { Console.WriteLine(args); }); //3.无参有返回值调用 var result = NewAppDomain.Execute(() => { return "helloworld"; }); //4.有参有返回值调用 var parameter = 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()); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。