我想要完成的只是:在同一个 AppDomain 中运行 Silo 和 Client
使用奥尔良的教程一切都很顺利:
static void Main(string[] args)
{
AppDomain hostDomain = AppDomain.CreateDomain("OrleansHost", null,
new AppDomainSetup()
{
AppDomainInitializer = InitSilo
});
DoSomeClientWork();
hostDomain.DoCallBack(ShutdownSilo);
}
static void InitSilo(string[] args)
{
siloHost = new SiloHost(System.Net.Dns.GetHostName())
{
ConfigFileName = "SiloConfiguration.xml"
};
siloHost.InitializeOrleansSilo();
var startedok = siloHost.StartOrleansSilo(); //Works perfectly
if (!startedok)
throw new SystemException(String.Format("Failed to start Orleans silo '{0}' as a {1} node", siloHost.Name, siloHost.Type));
}
static void DoSomeClientWork()
{
var config = Orleans.Runtime.Configuration.ClientConfiguration.LocalhostSilo(30000);
GrainClient.Initialize(config);
var friend = GrainClient.GrainFactory.GetGrain<IHello>(0);
var result = friend.SayHello("Goodbye").Result;
Console.WriteLine(result);
}
当我想使用相同的 AppDomain 时出现问题:
static void Main(string[] args)
{
//Same AppDomain
Task.Run(() => InitSilo());
DoSomeClientWork(); //This is changed to await/retry until the Silo is Up
ShutdownSilo();
}
为什么我要走这条路:这个想法是为了防止客户端通过网络退出并再次进入,因为它们在同一台机器上运行。由于网络活动,这会产生开销。所以我试图避免这种开销。
当然,如果本地 Silo 出现故障,客户端必须通过网络出去才能找到可用的 Silo。
让事情变得过于复杂的是,我看不到任何有用的错误,只有错误和一些 lib 引用未找到错误。
原始代码被简化只是为了避免弄脏它,但是如果你觉得你需要看看我到目前为止做了什么,请告诉我。任何帮助、建议或建议都是有用的。