Интерфейс CF WPF зависает при вызове IronPython внутри C # Visual Studio - PullRequest
0 голосов
/ 12 декабря 2018

Я только что написал программу на C #, чтобы создать пользовательский интерфейс и интегрировать в нее ironpython, чтобы выполнить некоторые вычисления.Но когда я вызываю функцию, пользовательский интерфейс останавливается до тех пор, пока она не завершится (даже индикатор выполнения зависает)

Простите, если вопрос глуп, поскольку это мой первый вопрос на 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 голосов
/ 16 декабря 2018

Я рекомендую использовать шаблон TAP ( Асинхронный шаблон на основе задач ) без ожидания (поскольку вы хотите сразу получить отзывчивый пользовательский интерфейс) следующим образом:

    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);
        });
    }
0 голосов
/ 12 декабря 2018

Простой способ решить эту проблему - сделать асинхронный 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, чтобы увидеть, как это работает.

...