首页 > 解决方案 > 在 C# Visual Studio 中调用 IronPython 时 C# WPF UI 冻结

问题描述

我刚刚用 C# 编写了一个程序来制作一个 ui 并将 Ironpython 集成到其中进行一些计算。但是当我调用该函数时,UI会冻结,直到函数结束(甚至进度条也会冻结)

如果这个问题很愚蠢,请原谅我,因为这是我在 StackOverFlow.com 上的第一个问题

功能是:

private void ValidateB_Click(object sender, RoutedEventArgs e)
{
    string txt = proInp.Text;
    var eng = Python.CreateEngine();
    var searchPaths = eng.GetSearchPaths();
    searchPaths.Add("F:\\Python27\\Lib");
    searchPaths.Add("F:\\Python 3.6\\Lib");
    eng.SetSearchPaths(searchPaths);
    var scope = eng.CreateScope();
    scope.SetVariable("key", txt);
    eng.Execute("import os\nkey="os.getcwd()", scope);
}

标签: c#pythonwpfvisual-studioironpython

解决方案


解决此问题的一种简单方法是使 Click Handler 异步并运行一个新任务(但如果您有任何不应在任务内完成的 GUI 交互):

private async void ValidateB_Click(object sender, RoutedEventArgs e)
{
   await Task.Factory.StartNew(() => {
       string txt = proInp.Text;
       var eng = Python.CreateEngine();
       var searchPaths = eng.GetSearchPaths();
       searchPaths.Add("F:\\Python27\\Lib");
       searchPaths.Add("F:\\Python 3.6\\Lib");
       eng.SetSearchPaths(searchPaths);
       var scope = eng.CreateScope();
       scope.SetVariable("key", txt);
       eng.Execute("import os\nkey="os.getcwd()", scope);
   }
}

但更好的是与异步命令和绑定一起使用。可以阅读 WPF 和 MMVM 以了解其工作原理。


推荐阅读