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>(T parameter, Func<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());
}