Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Apache Ignite.NET和AppDomain.CurrentDomain.ProcessExit_C#_.net_.net Core_Ignite - Fatal编程技术网

C# Apache Ignite.NET和AppDomain.CurrentDomain.ProcessExit

C# Apache Ignite.NET和AppDomain.CurrentDomain.ProcessExit,c#,.net,.net-core,ignite,C#,.net,.net Core,Ignite,考虑类,利用Apache Ignite.NET库 公共接口ICluster { void Join(); 无效休假(); } 公共类ApacheIgniteClusterImpl:ICluster { 私有IIgnite点火{get;set;} 专用int多播端口{get;} 私有int ThinClientPort{get;} 公共ApacheIgniteClusterImpl(int multicastPort=47401,int thinClientPort=10800) { 多播端口=多

考虑类,利用Apache Ignite.NET库

公共接口ICluster
{
void Join();
无效休假();
}
公共类ApacheIgniteClusterImpl:ICluster
{
私有IIgnite点火{get;set;}
专用int多播端口{get;}
私有int ThinClientPort{get;}
公共ApacheIgniteClusterImpl(int multicastPort=47401,int thinClientPort=10800)
{
多播端口=多播端口;
ThinClientPort=ThinClientPort;
}
公共void Join()
{
如果(点火!=null)
{
返回;
}
var配置=新配置
{
ClientConnectorConfiguration=新的ClientConnectorConfiguration
{
端口=ThinClientPort,
},
DiscoverySpi=新的TcpDiscoverySpi
{
IpFinder=新的TcpDiscoveryMulticastIpFinder()
{
多播端口=多播端口,
}
},
JVM选项=新列表()
{
“-diagnite\u NO\u SHUTDOWN\u HOOK=true”,
},
};
//开始
点火=点火。启动(配置);
}
公众假期
{
点火。停止(空,真);
点火=零;
}
}
通常,在.NET标准中,我们可以挂接到
AppDomain.CurrentDomain.ProcessExit
事件中,在那里我们可以进行清理工作。但是,一旦Apache Ignite.NET创建了JVM,当我使用
kill
杀死MacOS上的控制台应用程序时,将永远不会触发AppDomain.CurrentDomain.ProcessExit

我在调试时做了一些研究,发现在调用了
private static Jvm CreateJvm(IgniteConfiguration cfg,ILogger log)
之后,会发生这种情况

你知道那里发生了什么吗?如果有机会我们可以连接到AppDomain.CurrentDomain.ProcessExit

UPD:无论是
AppDomain.CurrentDomain.DomainUnload
还是
System.Runtime.Loader.AssemblyLoadContext.Unload
都不起作用。

ProcessExit

我相信Ignite.NET与此无关。我已对此进行了检查(未引用或启动Ignite),如果您强制终止该过程,则不会调用处理程序。

根据:

嵌入JVM的应用程序经常需要捕获信号,如SIGINT或SIGTERM,这可能会导致干扰JVM信号处理程序。可以使用-Xrs选项来解决此问题。使用-Xrs时,JVM不会更改SIGINT、SIGTERM、SIGHUP和SIGQUIT的信号掩码,也不会安装这些信号的信号处理程序

因此,在稍微修改初始类之后,我能够处理
AppDomain.CurrentDomain.ProcessExit
Console.CancelKeyPress

/。。。
JVM选项=新列表()
{

“-Xrs”,//我同意你的看法,不能保证调用
ProcessExit
。但是,经过深入研究,我找到了解决方案。事实证明,JVM修改了信号掩码,因此当我们通过JNI启动Apache Ignite时,主机应用程序不再能够以正确的方式接收它们。解决方案非常简单:将-Xrs添加到JVM选项中。之后,我可以将处理程序添加到
AppDomain.CurrentDomain.ProcessExit
控制台。CancelKeyPress
非常有趣,感谢您的调查和发布解决方案!