Я пишу программирование на c # с консольным приложением и wpf-приложением с одинаковым кодом, но результат будет разным.
Вот код в Консольном приложении.
javaAccessBridge = Jab.Instance;
javaAccessBridge.Init();
using (JavaApplication app = new JavaApplication())
{
JavaApplicationContext context = new JavaApplicationContext()
{
ExecutableFile = @"c:\Dev\sq.jar"
};
app.Launch(context);
}
Thread.Sleep(5000);
// return 0, not found any jvm instance.
javaAccessBridge.EnumJvms().Count;
Вот код в WPF
public MainWindow()
{
InitializeComponent();
javaAccessBridge = Jab.Instance;
javaAccessBridge.Init();
}
private void Find_Click(object sender, RoutedEventArgs e)
{
using (JavaApplication app = new JavaApplication())
{
JavaApplicationContext context = new JavaApplicationContext()
{
ExecutableFile = @"c:\Dev\sq.jar"
};
app.Launch(context);
}
// count 1 jvm instance.
List<AccessibleJvm> jvms = javaAccessBridge.EnumJvms();
}
Я запускаю приложение, затем нажимаю кнопку, вызываю Find_Click, и jvms.Count = 1.
Я думаю, что причина в том, что в WPF слишком много потоков, один для MainWindow () и второй для Find_Click. но кажется что это не правильно.
потому что я написал консольное приложение в 2 потока, но результат не изменился.
javaAccessBridge = Jab.Instance;
public void InitLib()
{
javaAccessBridge.Init();
}
public void LaunchApp()
{
using (JavaApplication app = new JavaApplication())
{
JavaApplicationContext context = new JavaApplicationContext()
{
ExecutableFile = @"c:\Dev\sq.jar"
};
app.Launch(context);
}
Thread init = new Thread(InitLib);
Thread app = new Thread(LaunchApp);
init.Start();
app.Start();
Thread.Sleep(5000);
// still return 0
javaAccessBridge.EnumJvms().Count;