[IronPython] Hosting IronPython in Silverlight - background loading

Lukas Cenovsky cenovsky at bakalari.cz
Sun Aug 22 20:25:02 CEST 2010


  I've entered the issue on tracker: 
http://ironpython.codeplex.com/workitem/28635

--
-- Lukáš


On 18.8.2010 15:44, Jimmy Schementi wrote:
> 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 
> <mailto: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 <mailto: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
>>         <mailto: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
>>             <mailto:Users at lists.ironpython.com>
>>             http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>
>>
>>
>>         _______________________________________________
>>         Users mailing list
>>         Users at lists.ironpython.com <mailto:Users at lists.ironpython.com>
>>         http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>
>>
>>
>>     _______________________________________________
>>     Users mailing list
>>     Users at lists.ironpython.com  <mailto:Users at lists.ironpython.com>
>>     http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
>     _______________________________________________
>     Users mailing list
>     Users at lists.ironpython.com <mailto: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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20100822/3a908c0f/attachment.html>


More information about the Ironpython-users mailing list