[IronPython] BeginInvoke from C# to IronPython
Keith Rome
rome at Wintellect.com
Sun Apr 10 07:40:33 CEST 2011
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 | krome at wintellect.com
www.wintellect.com
-----Original Message-----
From: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of Matthew Green
Sent: Sunday, April 10, 2011 12:47 AM
To: users at lists.ironpython.com
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
Users at lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
More information about the Ironpython-users
mailing list