[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