在C#Visual Studio中调用IronPython时,C#WPF UI冻结

时间:2018-12-12 14:51:36

标签: c# python wpf visual-studio ironpython

我刚刚用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);
}

2 个答案:

答案 0 :(得分:2)

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

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的信息,以了解其工作原理。

答案 1 :(得分:1)

我推荐使用TAP模式(Task-based Asynchronous Pattern),而无需等待(因为您想立即获得响应UI),如下所示:

    private void ValidateB_Click(object sender, RoutedEventArgs e)
    {
        Task t = 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);
        });
    }