Asynchronous Delegates

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

http://github.com/casualjim/ironnails/blob/master/IronNails/vendor/iron_nails/lib/nails_engine.rb#L61

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