如何在同一个AppDomain中运行Microsoft Orleans Silo和Client

时间:2017-07-13 20:20:32

标签: c# asynchronous actor orleans

我想要完成的只是:在同一个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引用找不到错误。

  

简化原始代码只是为了避免弄脏,但如果   你觉得你需要看看我到目前为止所做的事情,请告诉我。   任何帮助,建议或建议都很有用。

1 个答案:

答案 0 :(得分:1)

如果你升级到奥尔良1.5.0,你应该能够实现这一点,因为很多静态都被删除了。您还应该直接使用ClientBuilder和IClusterClient而不是静态GrainClient来实现它。实际上,一旦升级到1.5.0,VS中的默认模板就不再为客户端/孤岛主机使用单独的AppDomain。

话虽如此,即使在相同的AppDomain下,目前还没有完全跳过网络代码的内置支持,但我们正处于规划阶段,开始支持它。目前的想法是你仍然使用IClusterClient抽象,但是在我们通过没有做任何额外网络的情况下,我们将做更聪明的事情。因此,即使它尚未优化,开始使用它也是最安全的选择。