[IronPython] Hosting IronPython in Silverlight - background loading
Jimmy Schementi
jimmy at schementi.com
Wed Aug 18 15:44:33 CEST 2010
Lukas, this is the bug in Microsoft.Scripting.Silverlight. Because you
do "setup.HostType
= typeof(Microsoft.Scripting.Silverlight.BrowserScriptHost)", all
file-system lookups (like looking for a module) go through that type.
~Jimmy
On Wed, Aug 18, 2010 at 3:23 AM, Lukas Cenovsky <cenovsky at bakalari.cz>wrote:
> Looks like there is a bug in DynamicEngine. When I tried the old way, it
> works:
>
> private void UserControl_Loaded(object sender, RoutedEventArgs ev)
> {
> IPloader = new BackgroundWorker();
> IPloader.DoWork += new DoWorkEventHandler((s, e) =>
> {
> ScriptRuntimeSetup setup = new ScriptRuntimeSetup();
> setup.LanguageSetups.Add(Python.CreateLanguageSetup(null));
> setup.HostType =
> typeof(Microsoft.Scripting.Silverlight.BrowserScriptHost);
> setup.DebugMode = true;
> runtime = new ScriptRuntime(setup);
> engine = Python.GetEngine(runtime);
> foreach (string str in new string[] { "mscorlib", "System",
> "System.Windows", "System.Windows.Browser", "System.Net" })
> {
>
> runtime.LoadAssembly(runtime.Host.PlatformAdaptationLayer.LoadAssembly(str));
> }
> // engine.Execute("import imptest"); --this does not work
>
> }
> );
> IPloader.RunWorkerCompleted += new RunWorkerCompletedEventHandler((s,
> e) =>
> {
> this.textBlock1.Text = "IronPython loaded";
> }
> );
> IPloader.RunWorkerAsync();
> }
>
> What does not work is importing modules in the background thread (commented
> line). It throws the following exception:
>
> System.InvalidOperationException was unhandled by user code
> Message=This operation can only occur on the UI Thread.
> StackTrace:
> at
> Microsoft.Scripting.Actions.Calls.MethodCandidate.Caller.Call(Object[] args,
> Boolean& shouldOptimize)
> at
> IronPython.Runtime.Types.BuiltinFunction.BuiltinFunctionCaller`5.Call4(CallSite
> site, CodeContext context, TFuncType func, T0 arg0, T1 arg1, T2 arg2, T3
> arg3)
> at
> System.Dynamic.UpdateDelegates.UpdateAndExecute6[T0,T1,T2,T3,T4,T5,TRet](CallSite
> site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
> at IronPython.Runtime.Importer.Import(CodeContext context, String
> fullName, PythonTuple from, Int32 level)
> at IronPython.Runtime.Operations.PythonOps.ImportTop(CodeContext
> context, String fullName, Int32 level)
> at
> Microsoft.Scripting.Interpreter.FuncCallInstruction`4.Run(InterpretedFrame
> frame)
> at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame
> frame)
> at Microsoft.Scripting.Interpreter.LightLambda.Run1[T0,TRet](T0
> arg0)
> at IronPython.Compiler.RuntimeScriptCode.InvokeTarget(Scope scope)
> at IronPython.Compiler.RuntimeScriptCode.Run()
> at Microsoft.Scripting.SourceUnit.Execute()
> at Microsoft.Scripting.Hosting.ScriptSource.Execute()
> at Microsoft.Scripting.Hosting.ScriptEngine.Execute(String
> expression)
>
> at SLHosting.MainPage.<UserControl_Loaded>b__0(Object s,
> DoWorkEventArgs e)
> at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs
> e)
> at System.ComponentModel.BackgroundWorker.OnRun(Object argument)
> InnerException:
>
>
> runtime.ImportModule("imptest"); is similar story so I guess it cannot be
> done, right?
>
> --
> -- Lukáš
>
>
>
> On 18.8.2010 5:05, Jimmy Schementi wrote:
>
> True, but according to his exception stack it never gets there ... it
> throws on the "runtime = DynamicEngine.CreateRuntime(true);" line. It throws
> because somewhere in that method it doesn't dispatch to the UI thread as you
> described. Those are the fixes I need to do.
>
> ~Jimmy
>
>
> 2010/8/17 Dave Curylo <curylod at asme.org>
>
>> Lukas,
>>
>> I think the problem is the RunWorkerCompleted handler trying to update
>> the UI. Wrap calls from a background thread to update UI controls in
>> something like this so the Dispatcher updates any controls on the UI thread:
>>
>> this.Dispatcher.BeginInvoke(() =>
>> {
>> this.textBlock1.Text = "IronPython loaded";
>> });
>>
>> Hope that helps.
>>
>> -Dave
>>
>> 2010/8/17 Lukas Cenovsky <cenovsky at bakalari.cz>
>>
>> Hi all,
>>> is it possible to load IronPython engine in the background thread in
>>> Silverlight?
>>>
>>> I tried to load it via BackgroundWorker:
>>>
>>> private void UserControl_Loaded(object sender, RoutedEventArgs ev)
>>> {
>>> IPloader = new BackgroundWorker();
>>> IPloader.DoWork += new DoWorkEventHandler((s, e) =>
>>> {
>>> runtime = DynamicEngine.CreateRuntime(true); // debug mode
>>> true
>>> engine = runtime.GetEngine("python");
>>> }
>>> );
>>> IPloader.RunWorkerCompleted += new RunWorkerCompletedEventHandler((s,
>>> e) =>
>>> {
>>> this.textBlock1.Text = "IronPython loaded";
>>> }
>>> );
>>> IPloader.RunWorkerAsync();
>>> }
>>>
>>> It fails with the following exception:
>>>
>>> System.UnauthorizedAccessException was unhandled by user code
>>> Message=Invalid cross-thread access.
>>> StackTrace:
>>> at MS.Internal.XcpImports.CheckThread()
>>> at
>>> System.Windows.DependencyObject.GetValueInternal(DependencyProperty dp)
>>> at System.Windows.Deployment.get_Parts()
>>> at
>>> Microsoft.Scripting.Silverlight.DynamicAppManifest.AssemblyParts()
>>> at Microsoft.Scripting.Silverlight.DynamicAppManifest..ctor()
>>> at Microsoft.Scripting.Silverlight.DynamicEngine.CreateLangConfig()
>>> at
>>> Microsoft.Scripting.Silverlight.DynamicEngine.CreateRuntimeSetup(Boolean
>>> debugMode)
>>> at
>>> Microsoft.Scripting.Silverlight.DynamicEngine.CreateRuntime(Boolean
>>> debugMode)
>>> at SLHosting.MainPage.<UserControl_Loaded>b__0(Object s,
>>> DoWorkEventArgs e)
>>> at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs
>>> e)
>>> at System.ComponentModel.BackgroundWorker.OnRun(Object argument)
>>> InnerException:
>>>
>>> Thanks for any advice.
>>>
>>> --
>>> -- Lukáš
>>>
>>> _______________________________________________
>>> Users mailing list
>>> Users at lists.ironpython.com
>>> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>>
>>
>>
>> _______________________________________________
>> Users mailing list
>> Users at lists.ironpython.com
>> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>
>>
>
> _______________________________________________
> Users mailing listUsers at lists.ironpython.comhttp://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20100818/2908d2ea/attachment.html>
More information about the Ironpython-users
mailing list