c# - 在 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);
}
解决方案
解决此问题的一种简单方法是使 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 以了解其工作原理。
推荐阅读
- python - 这两种情况有什么区别:传递类名与对象
- r - 根据组为直方图着色时防止错误的密度图
- python-3.x - pandas to_datetime 无法将非零填充字符串转换为日期时间
- c++ - 我提交了解决方案并在第 4 个测试用例中遇到了时间限制错误
- c# - iOS websocket连接即时断开
- javascript - 从任何浏览器查看 javascript 变量
- amazon-web-services - 如何访问被管理员拒绝的服务?
- html - 在Vue中单击时突出显示选定的按钮
- c# - 无法将 JSON 数据获取到 gridview
- typescript - 打字稿将json中的字符串转换为字符串文字