Hello guys,
I’d like to use asynchronous delegates, but it doesn’t seem to work.
The IronRuby website mentioned that I can do:
require ‘System’
=> true
require ‘System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’
=> true
my_action = System::Action.new { puts “Howdy!” }
=> System.Action
my_action.invoke
“Howdy!”
=> nil
That works fine, but if I try this instead:
result = my_action.BeginInvoke(nil,nil)
my_action.EndInvoke(result)
I get:
System::NullReferenceException: Object reference not set to an instance
of an object.
Am I missing something, or is there another way to do asynchronous
delegates in IR.
Thanks in advance,
Bassel
Hi Bassel,
Ruby provides its own support for asynchronous operations in its Thread
class:
Thread.new do
puts “howdy!”
end
If you specifically need to run a .NET delegate asynchronously, you can
call
its invoke method within this structure:
Thread.new do
my_action.invoke
end
More info on Ruby’s Thread class:
http://corelib.rubyonrails.org/classes/Thread.html
Does that meet your needs?
Cheers,
Mark
or take a look here: I think the threadpool code is the one you want but
it’s commented out right now
Met vriendelijke groeten - Best regards - Salutations
Ivan Porto C.
GSM: +32.486.787.582
Blog: http://flanders.co.nz
Twitter: http://twitter.com/casualjim
Author of IronRuby in Action (http://manning.com/carrero)
Thanks guys. I ended up writing a wrapper that takes an action and runs
it in an async delegate and that worked fine. You can obviously get
much fancier, but an example would be along the lines of this:
C# class:
public class WrapInDelegate{
public delegate void DelegateWrapper();
public DelegateWrapper wrapper;
public WrapInDelegate(Action a){
wrapper = delegate(){a.Invoke();};
}
public IAsyncResult BeginInvoke(){
return wrapper.BeginInvoke(null, null);
}
public void EndInvoke(IAsyncResult result){
wrapper.EndInvoke(result);
}
}
From Ruby:
d = WrapInDelegate.new(System::Action.new { puts “I run for no
man…” })
r = d.BeginInvoke
d.EndInvoke r