BeginInvoke from C# to IronPython

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

BeginInvoke from C# to IronPython

BabyGGuy
Hi everyone,

I came across a simple C# httplistener
(http://www.paraesthesia.com/archive/2008/07/16/simplest-embedded-web-server-ever-with-httplistener.aspx).
I decided to have a quick play with it and leave the listener in C#
and make the client calls and callback in IronPython. After multiple
attempts I failed to get C#'s BeginInvoke call to callback to
IronPython. That catch shows a "The object must be a runtime
Reflection object." error.

I implemented this short example which failed to callback to the
Python function and hits the catch after trying to BeginInvoke -
----------
C#:
using System;
using System.Globalization;
using System.Net;
using System.Threading;

namespace test
{
    public class Class1
    {
        public event EventHandler<SomeEventArgs> IncomingRequest = null;

        public void testInvoke()
        {
            SomeEventArgs e = new SomeEventArgs(1);
            try
            {
                if (this.IncomingRequest != null)
                {
                    this.IncomingRequest.BeginInvoke(this, e, null, null);
                }
            }
            catch
            {
                //failed
            }
        }
    }
}

public class SomeEventArgs : EventArgs
{
    public int RequestContext;

    public SomeEventArgs(int anarg)
    {
        this.RequestContext = anarg;
    }
}

Python:
import clr
clr.AddReference("test")
from test import *

def testcallback(foo, bar):
    pass

thing = Class1()
thing.IncomingRequest += testcallback
thing.testInvoke()
----------

I get the feeling I'm missing some basic knowledge about how
IronPython functions are added as events. But I feel like I'm getting
distracted and looking at all the wrong things. Thanks for your
help!!!
_______________________________________________
Users mailing list
[hidden email]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
Reply | Threaded
Open this post in threaded view
|

Re: BeginInvoke from C# to IronPython

Keith Rome
Not sure if you are aware, but calling a delegate like that via BeginInvoke() is really just the same thing as using ThreadPool.QueueUserWorkItem(). You might save yourself a lot of hassle by omitting the Class1 and event handler funny business, and just pass your callback directly to QUWI:

import clr
clr.AddReference("System")
from System import Threading

def testCallback(foo):
  # print might not be safe here due to threading... but Debug.WriteLine() is thread-safe
  from System import Diagnostics
  Diagnostics.Debug.WriteLine(foo)

# test using sync call
testCallback("sync")

# test using async call
cb = Threading.WaitCallback(testCallback)
Threading.ThreadPool.QueueUserWorkItem(cb, "async")


Keith Rome
Senior Consultant and Architect
MCPD-EAD, MCSD, MCDBA, MCTS-WPF, MCTS-TFS, MCTS-WSS
Wintellect | 770.617.4016 | [hidden email]
www.wintellect.com

-----Original Message-----
From: [hidden email] [mailto:[hidden email]] On Behalf Of Matthew Green
Sent: Sunday, April 10, 2011 12:47 AM
To: [hidden email]
Subject: [IronPython] BeginInvoke from C# to IronPython

Hi everyone,

I came across a simple C# httplistener
(http://www.paraesthesia.com/archive/2008/07/16/simplest-embedded-web-server-ever-with-httplistener.aspx).
I decided to have a quick play with it and leave the listener in C# and make the client calls and callback in IronPython. After multiple attempts I failed to get C#'s BeginInvoke call to callback to IronPython. That catch shows a "The object must be a runtime Reflection object." error.

I implemented this short example which failed to callback to the Python function and hits the catch after trying to BeginInvoke -
----------
C#:
using System;
using System.Globalization;
using System.Net;
using System.Threading;

namespace test
{
    public class Class1
    {
        public event EventHandler<SomeEventArgs> IncomingRequest = null;

        public void testInvoke()
        {
            SomeEventArgs e = new SomeEventArgs(1);
            try
            {
                if (this.IncomingRequest != null)
                {
                    this.IncomingRequest.BeginInvoke(this, e, null, null);
                }
            }
            catch
            {
                //failed
            }
        }
    }
}

public class SomeEventArgs : EventArgs
{
    public int RequestContext;

    public SomeEventArgs(int anarg)
    {
        this.RequestContext = anarg;
    }
}

Python:
import clr
clr.AddReference("test")
from test import *

def testcallback(foo, bar):
    pass

thing = Class1()
thing.IncomingRequest += testcallback
thing.testInvoke()
----------

I get the feeling I'm missing some basic knowledge about how IronPython functions are added as events. But I feel like I'm getting distracted and looking at all the wrong things. Thanks for your help!!!
_______________________________________________
Users mailing list
[hidden email]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

_______________________________________________
Users mailing list
[hidden email]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
Reply | Threaded
Open this post in threaded view
|

Re: BeginInvoke from C# to IronPython

BabyGGuy
Thank you! This is a way better way of doing it!

On Sun, Apr 10, 2011 at 3:40 PM, Keith Rome <[hidden email]> wrote:

> Not sure if you are aware, but calling a delegate like that via BeginInvoke() is really just the same thing as using ThreadPool.QueueUserWorkItem(). You might save yourself a lot of hassle by omitting the Class1 and event handler funny business, and just pass your callback directly to QUWI:
>
> import clr
> clr.AddReference("System")
> from System import Threading
>
> def testCallback(foo):
>  # print might not be safe here due to threading... but Debug.WriteLine() is thread-safe
>  from System import Diagnostics
>  Diagnostics.Debug.WriteLine(foo)
>
> # test using sync call
> testCallback("sync")
>
> # test using async call
> cb = Threading.WaitCallback(testCallback)
> Threading.ThreadPool.QueueUserWorkItem(cb, "async")
>
>
> Keith Rome
> Senior Consultant and Architect
> MCPD-EAD, MCSD, MCDBA, MCTS-WPF, MCTS-TFS, MCTS-WSS
> Wintellect | 770.617.4016 | [hidden email]
> www.wintellect.com
>
> -----Original Message-----
> From: [hidden email] [mailto:[hidden email]] On Behalf Of Matthew Green
> Sent: Sunday, April 10, 2011 12:47 AM
> To: [hidden email]
> Subject: [IronPython] BeginInvoke from C# to IronPython
>
> Hi everyone,
>
> I came across a simple C# httplistener
> (http://www.paraesthesia.com/archive/2008/07/16/simplest-embedded-web-server-ever-with-httplistener.aspx).
> I decided to have a quick play with it and leave the listener in C# and make the client calls and callback in IronPython. After multiple attempts I failed to get C#'s BeginInvoke call to callback to IronPython. That catch shows a "The object must be a runtime Reflection object." error.
>
> I implemented this short example which failed to callback to the Python function and hits the catch after trying to BeginInvoke -
> ----------
> C#:
> using System;
> using System.Globalization;
> using System.Net;
> using System.Threading;
>
> namespace test
> {
>    public class Class1
>    {
>        public event EventHandler<SomeEventArgs> IncomingRequest = null;
>
>        public void testInvoke()
>        {
>            SomeEventArgs e = new SomeEventArgs(1);
>            try
>            {
>                if (this.IncomingRequest != null)
>                {
>                    this.IncomingRequest.BeginInvoke(this, e, null, null);
>                }
>            }
>            catch
>            {
>                //failed
>            }
>        }
>    }
> }
>
> public class SomeEventArgs : EventArgs
> {
>    public int RequestContext;
>
>    public SomeEventArgs(int anarg)
>    {
>        this.RequestContext = anarg;
>    }
> }
>
> Python:
> import clr
> clr.AddReference("test")
> from test import *
>
> def testcallback(foo, bar):
>    pass
>
> thing = Class1()
> thing.IncomingRequest += testcallback
> thing.testInvoke()
> ----------
>
> I get the feeling I'm missing some basic knowledge about how IronPython functions are added as events. But I feel like I'm getting distracted and looking at all the wrong things. Thanks for your help!!!
> _______________________________________________
> Users mailing list
> [hidden email]
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
> _______________________________________________
> Users mailing list
> [hidden email]
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
_______________________________________________
Users mailing list
[hidden email]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com