У меня возникли проблемы, на которые я надеюсь, что вы сможете помочь! Я пытаюсь обновить этот параметр grid.Width в цикле while, во время сна (500). Но, когда я нажимаю скрипт запуска в своей программе, весь графический интерфейс останавливается. Я уже пробовал запустить сценарий в другом потоке и использовать BackgroundWorker, но все же в обоих случаях они блокируют мой графический интерфейс приложения до завершения скрипта. Не могли бы вы взглянуть на следующий код, пожалуйста?IronPython как язык сценариев для C# WPF VS 2015
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using System.Threading;
using IronPython.Hosting;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
string script;
ScriptEngine engine;
ScriptScope scope;
Thread threadScript;
public MainWindow()
{
InitializeComponent();
engine = Python.CreateEngine();
scope = engine.CreateScope();
string variableName = "isto";
object gridMier = gridScript;
scope.SetVariable(variableName, gridMier);
}
public void rodarScript()
{
this.Dispatcher.Invoke((Action)(() =>
{
try
{
//PARTE PARA ADICIONAR BIBLIOTECAS BASICAS PARA DESENVOLVIMENTO COM OS SCRIPTS
script = @"#Reference the WPF assemblies
import clr
clr.AddReferenceByName(""PresentationFramework, Version = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35"")
clr.AddReferenceByName(""PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"")
import System.Windows
def getMyObject():
return isto
objeto = getMyObject()
#Atalhos de referencias para adicionar
Thickness = System.Windows.Thickness
from System.Threading.Thread import Sleep
Debug = System.Diagnostics.Debug";
script = script + "\n" + textBoxScript.Text;
var source = engine.CreateScriptSourceFromString(script, SourceCodeKind.Statements);
//var compiled = source.Compile();
//var result = compiled.Execute(scope);
source.Execute(scope);
}
catch (Exception qualquerExcecaoEncontrada)
{
MessageBox.Show(qualquerExcecaoEncontrada.ToString(), "Scripting Test do Mier", MessageBoxButton.OK);
}
}));
}
private void buttonScript_Click(object sender, RoutedEventArgs e)
{
threadScript = new Thread(rodarScript);
threadScript.Start();
}
}
}
пример кода в IronPython (textBoxScript.Text)
for num in range(1,100):
objeto.Width = objeto.Width + 1
Sleep(500)
Этот простой код, работающий на волоске, блокирует весь мой GUI в течение 50 секунд. Любая помощь будет оценена!
Thanks, Lucas.
Во всех смыслах и задачах 'threadScript' никогда не используется. Вы сразу же «Dispatcher.Invoke» возвращаетесь к потоку пользовательского интерфейса. – Mitch
Извините, Митч не понял этого. threadScript используется, когда я нажимаю на эту кнопку, которую я имею в приложении. buttonScript_Click запускает его. –
Вы начинаете его, но сразу же возвращаетесь к потоку пользовательского интерфейса. Вы никогда не работаете с 'threadScript'. Если это не имеет смысла, вы должны, вероятно, попытаться лучше понять, что делает 'Dispatcher.Invoke': он запускает произвольный метод в потоке пользовательского интерфейса и ждет результата. Итак, весь код, который вы используете в 'rodarScript', работает в потоке пользовательского интерфейса, а не в' threadScript'. – Mitch