[IronPython] Making asynchronous calls in IronPython
Dino Viehland
dinov at microsoft.com
Tue May 5 00:23:02 CEST 2009
Oh, one possible work around is to write a C# stub that will do the
begin invoke for you. That'll be annoying if you have lots of
delegate types that you need to begin invoke on though.
> -----Original Message-----
> From: users-bounces at lists.ironpython.com [mailto:users-
> bounces at lists.ironpython.com] On Behalf Of Dino Viehland
> Sent: Monday, May 04, 2009 3:18 PM
> To: Discussion of IronPython
> Subject: Re: [IronPython] Making asynchronous calls in IronPython
>
> This is actually a CLR bug. A simple repro of the issue is below if
> anyone is curious.
>
> The CLR team has resolved this bug as "Won't Fix" and says a workaround
> is available. The
> only workaround I can think of is explicitly queueing the work item to
> the thread pool and
> provide an object for you to get state back on. I've asked them for
> more information.
>
> Unfortunately it means that currently this just won't work in
> IronPython on MS .NET at
> all today :(.
>
> using System;
> using System.Reflection;
> using System.Reflection.Emit;
> using System.Globalization;
>
> class Test {
> delegate void MyDelegate();
>
> public static void Main(string[]args) {
> DynamicMethod test = new DynamicMethod("Hello",
> typeof(void),
> new Type[]{typeof(string)},
> typeof(string).Module);
>
>
>
> MethodInfo writeString = typeof(Console).GetMethod("WriteLine",
> new Type[]{typeof(string)});
>
> ILGenerator il = test.GetILGenerator(256);
> il.Emit(OpCodes.Ldarg_0);
> il.EmitCall(OpCodes.Call, writeString, null);
> il.Emit(OpCodes.Ret);
>
>
> MyDelegate dlg = (MyDelegate)
> test.CreateDelegate(typeof(MyDelegate), "Hello World!");
> dlg.BeginInvoke(new AsyncCallback(Finished), null);
> Console.ReadLine();
> }
>
>
> public static void Finished(IAsyncResult ar) {
> }
> }
>
>
>
> > -----Original Message-----
> > From: users-bounces at lists.ironpython.com [mailto:users-
> > bounces at lists.ironpython.com] On Behalf Of Schmottlach, Glenn
> > Sent: Monday, May 04, 2009 2:58 PM
> > To: Discussion of IronPython
> > Subject: Re: [IronPython] Making asynchronous calls in IronPython
> >
> > Okay, call me clueless . . .
> >
> > This is what I have so far as an example:
> >
> > import clr
> > clr.AddReference('IronPython')
> >
> > from System import *
> > from System.Threading import Thread
> > from IronPython.Compiler import CallTarget0
> >
> > class Foo:
> > def start(self):
> > print 'Started.'
> > Thread.Sleep(3000)
> > threadId = System.Threading.Thread.CurrentThread
> > return 'Exiting thread %r' % (threadId)
> >
> > def finish(self, r):
> > print 'Finished.'
> >
> >
> > if __name__ == '__main__':
> > f = Foo()
> > caller = CallTarget0(f.start)
> > result = caller.BeginInvoke(None, None)
> > caller.EndInvoke(result)
> >
> >
> > Can you give me a concrete example of using CallTarget0 and
> > AsyncCallback to implement this? What it does now is print:
> >
> > Finished.
> > SystemError:Object reference not set to an instance of an object.
> >
> > Obviously, I'm not using AsyncCallback because it's not clear to me
> > what
> > I pass to the constructor and where I pass the subsequent object.
> >
> > If you could spare me a few moments and correct this simple sample it
> > would be very grateful.
> >
> > Thanks . . .
> >
> >
> > -----Original Message-----
> > From: users-bounces at lists.ironpython.com
> > [mailto:users-bounces at lists.ironpython.com] On Behalf Of Michael
> Foord
> > Sent: Monday, May 04, 2009 5:48 PM
> > To: Discussion of IronPython
> > Subject: Re: [IronPython] Making asynchronous calls in IronPython
> >
> > Schmottlach, Glenn wrote:
> > > I've looked at the C# examples in MSDN but they don't appear to
> lend
> > > themselves (at least with my limited experience in .NET) to an easy
> > > implementation in IronPython due to the dynamic nature of the type
> > > system in Python.
> > >
> > > The example I looked at:
> > >
> > > http://msdn.microsoft.com/en-us/library/h80ttd5f.aspx
> > >
> > >
> > > declares a delegate type which seems difficult to do in IronPython,
> > e.g.
> > >
> > > C#
> > >
> > > public delegate bool AsyncFactorCaller (
> > > int number,
> > > ref int primefactor1,
> > > ref int primefactor2);
> > >
> > > So what's the equivalent in IronPython?
> > >
> > > Also, (out) parameters are passed by reference to BeginInvoke and
> > > EndInvoke and it's not clear to me how to handle this in
> IronPython.
> > >
> > > So, I suspect I'm missing something in order to get things working.
> > What
> > > I really need to see is a concrete IronPython example and I think
> > things
> > > would gel at that point. Could you offer such an example . . .
> Google
> > > hasn't been helpful in this respect.
> > >
> >
> > out parameters are handled by IronPython as extra return values - you
> > wrap your callback function in CallTarget0 and an AsyncCallback.
> >
> > I hope this helps.
> >
> > Michael
> >
> > >
> > > -----Original Message-----
> > > From: users-bounces at lists.ironpython.com
> > > [mailto:users-bounces at lists.ironpython.com] On Behalf Of Michael
> > Foord
> > > Sent: Monday, May 04, 2009 4:33 PM
> > > To: Discussion of IronPython
> > > Subject: Re: [IronPython] Making asynchronous calls in IronPython
> > >
> > > Schmottlach, Glenn wrote:
> > >
> > >> Although I'm very comfortable with CPython, I'm new to IronPython
> > and
> >
> > >> the .NET framework. What I am looking for is sample code that
> shows
> > >> how to issue an asynchronous call from IronPython using the
> > >> BeginInvoke/EndInvoke mechanism of .NET.
> > >>
> > >>
> > >
> > > I can't remember the usage off the top of my head - but usage from
> > > IronPython is identical to usage from C#, so an MSDN example ought
> to
> > > give you what you need.
> > >
> > > All the best,
> > >
> > > Michael
> > >
> > >> Currently, I'm playing around with GTK# and a D-Bus .NET
> > >> implementation (NDesk-DBus) that only provides synchronous proxy
> > >> methods for D-Bus services. I believe (please correct me if I'm
> > wrong)
> > >>
> > >
> > >
> > >> that I should be able to use the BeginInvoke/EndInvoke mechanism
> to
> > >> issue these blocking proxy requests asynchronously and be notified
> > >> (via a callback) when the method has completed.
> > >>
> > >> My blocking proxy calls look something like this:
> > >>
> > >> ret = /self/._proxy.TunerGetCurrentWaveBand(0)
> > >>
> > >> where 'ret' returns the current waveband (AM, FM, etc..) and are
> > >> called from a button "clicked" delegate. I would rather not block
> > the
> >
> > >> GTK# dispatch loop while waiting for the reply from the service.
> Can
> > >> someone offer me any advice or provide a reference to sample code
> > that
> > >>
> > >
> > >
> > >> illustrates the basic concept from IronPython?
> > >>
> > >>
> > >>
> > >
> > ---------------------------------------------------------------------
> --
> > -
> > >
> > >> _______________________________________________
> > >> Users mailing list
> > >> Users at lists.ironpython.com
> > >> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
> > >>
> > >>
> > >
> > >
> > >
> >
> >
> > --
> > http://www.ironpythoninaction.com/
> > http://www.voidspace.org.uk/blog
> >
> >
> > _______________________________________________
> > 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 list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
More information about the Ironpython-users
mailing list