工作线程在到达使用块 C# Windows 窗体应用程序时停止执行

这是演示窗口窗体应用程序的样子:

在此处输入图片说明

这是实现的代码:

public partial class HornMorphoWindow : Form
{
    private static dynamic _morpho;

    private static string _analyzeWord;

    private static Logger logger = LogManager.GetCurrentClassLogger();

    public delegate void StatusDelegate();

    public HornMorphoWindow()
    {
        InitializeComponent();
    }

    private void HornMorphoWindow_Load(object sender, EventArgs e)
    {
        var splashScreen = new Splash();  // This is Splash Form
        splashScreen.Show();

        Application.DoEvents(); // Force the splash screen to be shown

        Task.Factory.StartNew(LoadLibrary).Wait(); // Wait for the library to load

        splashScreen.Close();
    }

   // When a button clicked
   private void analyze_Click(object sender, EventArgs e)
   {
        if (string.IsNullOrEmpty(amharicInput.Text)) return;

        _analyzeWord = amharicInput.Text; // amharicInput is TextBox
        analyze.Enabled = false; // analyze is a button

        Task.Factory.StartNew(AnalyzeWord);
    }

    private static void LoadLibrary()
    {
        logger.Info("Loaidng Library.....");
        using (Py.GIL())
        {
            _morpho = Py.Import("l3");
            _morpho.load_lang("am");
        }
        logger.Info("Library Loaded Sucessfully!");
    }

    private void AnalyzeWord()
    {
        logger.Info("Word Analyzation Started. Word: " + _analyzeWord);

        using (Py.GIL())
        {
            _analyzeWord = _morpho.anal_word("am", _analyzeWord, Py.kw("nbest", 1));
        }

        logger.Info("Word Analyzation Ended. Result:\n " + _analyzeWord);

        try
        {
            this.Invoke(new StatusDelegate(UpdateStatus));
        }
        catch
        {
           // Some problem occurred
        }

     }

    private void copyButton_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(result.Text)) return;

        Clipboard.SetText(result.Text, TextDataFormat.UnicodeText);
    }


    private void UpdateStatus()
    {
        result.Text = _analyzeWord; // result is a label

        copyButton.Visible = true; // copyButton shows up when result is successfull

        analyze.Enabled = true;
    }
}

我问这个问题是因为,我调用了 C# 函数,该函数使用using(Py.GIL()) block一个新线程执行,如上面的代码所示。它适用于第一轮(有时不适用),而对于下一轮,它会停止using block并且应用程序保持不变,不显示任何结果或异常。

如果我删除了 using(Py.GIL()) 块,应用程序就可以工作,并且为了测试而做其他事情。例如,将结果标签文本更改为其他内容。

我究竟做错了什么?

更新

问题不在于 LoadLibrary 函数。它是对AnalyzeWord 功能。在 LoadLibrary 上它成功地执行它但不是在 AnalyzeWord 函数上。

我按照@Damien 的建议提出了这个解决方案,并且奏效了。

private void HornMorphoWindow_Load(object sender, EventArgs e)
{
    var splashScreen = new Splash();  // This is Splash Form
    splashScreen.Show();

    Application.DoEvents(); // Force the splash screen to be shown

    // The newly added line and the solution for the problem
    PythonEngine.Initialize();
    PythonEngine.BeginAllowThreads();
    //********************************

    Task.Factory.StartNew(LoadLibrary).Wait(); // Wait for the library to load

    splashScreen.Close();
}

PythonEngine.BeginAllowThreads() 必须在主线程上初始化,否则它不起作用。

主线程将在初始化后保留 GIL,直到您通过从主线程(而不是从您的后台线程)调用 PythonEngine.BeginAllowThreads() 显式释放它

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Visual Studio中使用c ++创建Windows窗体应用程序时的最佳线程化方法是什么?

来自分类Dev

仅使用Windows窗体应用程序的C#游戏

来自分类Dev

在C ++ Windows窗体应用程序中打开新窗体

来自分类Dev

如何使用C#制作Windows窗体应用程序以接收来自串行端口的数据

来自分类Dev

使用C ++从Windows窗体应用程序访问Sqlite数据库

来自分类Dev

应用程序Windows窗体C#使用菜单(用户控件)

来自分类Dev

c# 如何在 Windows 窗体应用程序中使用方法?

来自分类Dev

vsto:使用C#在相同的解决方案中从Windows窗体应用程序迁移不同的excel工作簿

来自分类Dev

使用Visual Studio 2012创建的C#Windows窗体应用程序无法在Windows XP上运行

来自分类Dev

C#-Windows窗体应用程序-保存文件

来自分类Dev

C#打印Windows窗体应用程序

来自分类Dev

C#Windows窗体应用程序关闭

来自分类Dev

如何使C#Windows窗体应用程序适合屏幕

来自分类Dev

将SQLite Windows窗体应用程序迁移到通用Windows应用程序(C#)

来自分类Dev

如何通过单击按钮停止在Windows窗体应用程序中执行操作?

来自分类Dev

如何使用for循环在c#windows窗体应用程序中检查文本框是否为空,使用数组

来自分类Dev

Windows 窗体应用程序中的后台工作者

来自分类Dev

如何部署使用SQL Server Express 2012和Crystal Report开发的C#Windows窗体应用程序

来自分类Dev

如何在Windows窗体应用程序中使用C Sharp下载天蓝色的Blob快照

来自分类Dev

如何部署使用SQL Server Express 2012和Crystal Report开发的C#Windows窗体应用程序

来自分类Dev

在Windows窗体应用程序C#中使用计时器运行特定时间的循环

来自分类Dev

(C# Windows 窗体应用程序)如何重新启动应用程序

来自分类Dev

将我的 Visual-C++ DLL 添加到我的 VB.NET windows 窗体 GUI 应用程序时遇到问题

来自分类Dev

在Visual Studio中使用Windows窗体应用程序

来自分类Dev

在Win32应用程序中使用Windows窗体

来自分类Dev

在Windows窗体应用程序中使用Castle Windsor

来自分类Dev

在Windows窗体应用程序中使用库

来自分类Dev

使用 wcf 服务 Windows 窗体应用程序

来自分类Dev

如何在C Sharp Windows窗体应用程序中从窗体2修改窗体3中的值

Related 相关文章

  1. 1

    在Visual Studio中使用c ++创建Windows窗体应用程序时的最佳线程化方法是什么?

  2. 2

    仅使用Windows窗体应用程序的C#游戏

  3. 3

    在C ++ Windows窗体应用程序中打开新窗体

  4. 4

    如何使用C#制作Windows窗体应用程序以接收来自串行端口的数据

  5. 5

    使用C ++从Windows窗体应用程序访问Sqlite数据库

  6. 6

    应用程序Windows窗体C#使用菜单(用户控件)

  7. 7

    c# 如何在 Windows 窗体应用程序中使用方法?

  8. 8

    vsto:使用C#在相同的解决方案中从Windows窗体应用程序迁移不同的excel工作簿

  9. 9

    使用Visual Studio 2012创建的C#Windows窗体应用程序无法在Windows XP上运行

  10. 10

    C#-Windows窗体应用程序-保存文件

  11. 11

    C#打印Windows窗体应用程序

  12. 12

    C#Windows窗体应用程序关闭

  13. 13

    如何使C#Windows窗体应用程序适合屏幕

  14. 14

    将SQLite Windows窗体应用程序迁移到通用Windows应用程序(C#)

  15. 15

    如何通过单击按钮停止在Windows窗体应用程序中执行操作?

  16. 16

    如何使用for循环在c#windows窗体应用程序中检查文本框是否为空,使用数组

  17. 17

    Windows 窗体应用程序中的后台工作者

  18. 18

    如何部署使用SQL Server Express 2012和Crystal Report开发的C#Windows窗体应用程序

  19. 19

    如何在Windows窗体应用程序中使用C Sharp下载天蓝色的Blob快照

  20. 20

    如何部署使用SQL Server Express 2012和Crystal Report开发的C#Windows窗体应用程序

  21. 21

    在Windows窗体应用程序C#中使用计时器运行特定时间的循环

  22. 22

    (C# Windows 窗体应用程序)如何重新启动应用程序

  23. 23

    将我的 Visual-C++ DLL 添加到我的 VB.NET windows 窗体 GUI 应用程序时遇到问题

  24. 24

    在Visual Studio中使用Windows窗体应用程序

  25. 25

    在Win32应用程序中使用Windows窗体

  26. 26

    在Windows窗体应用程序中使用Castle Windsor

  27. 27

    在Windows窗体应用程序中使用库

  28. 28

    使用 wcf 服务 Windows 窗体应用程序

  29. 29

    如何在C Sharp Windows窗体应用程序中从窗体2修改窗体3中的值

热门标签

归档