加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# 跨应用程序域通讯

发布时间:2020-12-15 19:51:42 所属栏目:百科 来源:网络整理
导读:public class MyTask { public class MyEventArgs : EventArgs { public object EventData { get ; private set ; } public MyEventArgs( object eventData) { this .EventData = eventData; } } public event EventHandlerMyEventArgs MyEvent; public void
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());
        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读