首页 > 解决方案 > 控制台应用程序中的线程与 WPF 应用程序中的线程有什么不同

问题描述

我正在用 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;

标签: c#wpfmultithreadingconsole

解决方案


推荐阅读