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