我想要完成的只是:在同一个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停机,客户必须通过网络外出才能找到可用的筒仓。
使事情变得太复杂的事实是我无法看到任何有用的错误,只是错误和一些lib引用找不到错误。
简化原始代码只是为了避免弄脏,但如果 你觉得你需要看看我到目前为止所做的事情,请告诉我。 任何帮助,建议或建议都很有用。
答案 0 :(得分:1)
如果你升级到奥尔良1.5.0,你应该能够实现这一点,因为很多静态都被删除了。您还应该直接使用ClientBuilder和IClusterClient而不是静态GrainClient来实现它。实际上,一旦升级到1.5.0,VS中的默认模板就不再为客户端/孤岛主机使用单独的AppDomain。
话虽如此,即使在相同的AppDomain下,目前还没有完全跳过网络代码的内置支持,但我们正处于规划阶段,开始支持它。目前的想法是你仍然使用IClusterClient抽象,但是在我们通过没有做任何额外网络的情况下,我们将做更聪明的事情。因此,即使它尚未优化,开始使用它也是最安全的选择。