[IronPython] System.Windows.Forms.MethodInvoker
Matthew Barnard
m.stephen.barnard at gmail.com
Wed May 14 20:58:42 CEST 2008
Great, thanks Dino!
Very glad to see that I was having a legitimate problem, and not just doing
something stupid.
So I take from your reproduction that this is an issue of ALL asynchronous
delegate invocation;
is there a method to do this without manually writing my own threaded
invoker?
On Wed, May 14, 2008 at 9:15 AM, Dino Viehland <dinov at exchange.microsoft.com>
wrote:
> Ok I took a look at this and I believe this is a CLR bug – windbg was
> really just useful for showing the exception which VS wasn't doing for me.
> I've included the simple repro below which doesn't require IronPython. The
> issue is that when we have a dynamic method closed over the 1st parameter
> the remoting stack thinks we have the wrong number of arguments. It then
> dutifily tries to report an error but it AVs because the method has no
> declaring type because it's a dynamic method! So it's a bit of a double
> bug. There's also the fact that the process isn't getting ripped when this
> happens so someone's probably swallowing an exception they're not supposed
> to – a triple bug!
>
>
>
> I've sent this off to the CLR team to have them take a look. Unless they
> have a clever workaround this like means it won't work until the CLR is
> fixed L.
>
>
>
> 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) {
>
> }
>
> }
>
>
>
>
>
>
>
> *From:* users-bounces at lists.ironpython.com [mailto:
> users-bounces at lists.ironpython.com] *On Behalf Of *Matthew Barnard
> *Sent:* Wednesday, May 14, 2008 1:01 AM
> *To:* Discussion of IronPython
> *Subject:* Re: [IronPython] System.Windows.Forms.MethodInvoker
>
>
>
> I spent a good amount of time prodding like an awkward schoolboy at the
> framework with windbg.
> Everything is fine from the point of the BeginInvoke thread is created to
> the point where the function is being looked up.
> The framework spends a good deal of time rooting around in a MethodTable
> and looks up and calls a constructor for whatever it found there.
> This was the last thing I saw it doing before raising an Access Violation,
> though I was looking at the TV whilst stepping so I'm sure I missed
> something critical.
> And now I can sleep.
>
> On Tue, May 13, 2008 at 8:41 PM, Matthew Barnard <
> m.stephen.barnard at gmail.com> wrote:
>
> Ah- good catch Dino. Didn't see a "Started," so I failed to notice the
> "Finished." was actually printing ;)
> It appears that, as with the bit of code that provoked this test, start()
> is not being executed by BeginInvoke.
> Thread.Sleep(20000) still drops to "Finished" as soon as the script starts.
>
> And my assembly skills are nonexistant; you're on your own with windbg.
>
> On Tue, May 13, 2008 at 7:05 PM, Dino Viehland <
> dinov at exchange.microsoft.com> wrote:
>
> Where'd the call to Console.ReadLine go? That's the reason you don't
> see Finished printing… On 1.1 and 2.0B2 from the console or in a file w/ a
> call to Console.ReadLine or raw_input I end up seeing finished getting
> printed. We're simply exiting before the asynchronous operation but that
> doesn't fully answer the question – started is still never printing!
> Stranger yet you can call mi() directly showing the delegate is clearly
> created correctly and working. Anyway, I'll have to look at it closer – it
> might require windbg to figure out what's going wrong here.
>
>
>
> *From:* users-bounces at lists.ironpython.com [mailto:
> users-bounces at lists.ironpython.com] *On Behalf Of *Matthew Barnard
> *Sent:* Tuesday, May 13, 2008 5:39 PM
> *To:* IronPython List
> *Subject:* [IronPython] System.Windows.Forms.MethodInvoker
>
>
>
> The C# sample runs as expected, displaying 'Started. Finished.', but the
> ipy does nothing.
> Can someone enlighten me as to the difference? I assume it is something to
> do with the way functions are represented in ipy vs. what methodinvoker is
> looking for,
> but I'm honestly lost.
>
> C#:
>
> class foo
> {
> public void start()
> {
> Console.WriteLine("Started.");
> Thread.Sleep(2000);
> }
>
> public void finish(IAsyncResult r)
> {
> Console.WriteLine("Finished.");
> }
> }
>
> class Program
> {
> static void Main(string[] args)
> {
> foo bar = new foo();
>
> MethodInvoker mi = new MethodInvoker(bar.start);
> mi.BeginInvoke(new AsyncCallback(bar.finish), null);
>
> Console.ReadLine();
> }
> }
>
>
> IPY:
>
> import clr
>
> clr.AddReferenceByPartialName('System.Windows.Forms')
>
> from System import AsyncCallback
> from System.Threading import Thread
> from System.Windows.Forms import MethodInvoker
>
> class foo:
> def start(self):
> print 'Started.'
> Thread.Sleep(2000)
>
> def finish(self, r):
> print 'Finished.'
>
> bar = foo()
> mi = MethodInvoker(bar.start)
> mi.BeginInvoke(AsyncCallback(bar.finish), None)
>
>
> ___________________________
> Matthew Barnard
>
>
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
>
>
> --
> ___________________________
> Matthew Barnard
>
>
>
>
> --
> ___________________________
> Matthew Barnard
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
--
___________________________
Matthew Barnard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20080514/81d16305/attachment.html>
More information about the Ironpython-users
mailing list