# Asynchronous Delegates

**URL:** <https://www.ruby-forum.com/t/asynchronous-delegates/183270>\
**Category:** IronRuby\
**Created:** [February 11, 2010, 12:25am UTC](https://www.ruby-forum.com/t/asynchronous-delegates/183270 "2010-02-11T00:25:18Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![mercedes6s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3be4f8/32.png) [@mercedes6s](https://www.ruby-forum.com/u/mercedes6s)\
**Post date:** [February 11, 2010, 12:25am UTC](https://www.ruby-forum.com/t/asynchronous-delegates/183270/1 "2010-02-11T00:25:18Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![mercedes6s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3be4f8/32.png) [@mercedes6s](https://www.ruby-forum.com/u/mercedes6s)\
**Post date:** [February 11, 2010, 2:08pm UTC](https://www.ruby-forum.com/t/asynchronous-delegates/183270/2 "2010-02-11T14:08:50Z")

</div>

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](http://corelib.rubyonrails.org/classes/Thread.html)

Does that meet your needs?

Cheers,  
Mark

---

<div class="post-metadata">

**Author:** ![mercedes6s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3be4f8/32.png) [@mercedes6s](https://www.ruby-forum.com/u/mercedes6s)\
**Post date:** [February 11, 2010, 3:02pm UTC](https://www.ruby-forum.com/t/asynchronous-delegates/183270/3 "2010-02-11T15:02:42Z")

</div>

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](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](http://flanders.co.nz)  
Twitter: [http://twitter.com/casualjim](http://twitter.com/casualjim)  
Author of IronRuby in Action ([IronRuby in Action - Ivan Porto Carrero and Adam Burmister | Manning](http://manning.com/carrero))

---

<div class="post-metadata">

**Author:** ![mercedes6s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3be4f8/32.png) [@mercedes6s](https://www.ruby-forum.com/u/mercedes6s)\
**Post date:** [February 12, 2010, 12:10am UTC](https://www.ruby-forum.com/t/asynchronous-delegates/183270/4 "2010-02-12T00:10:12Z")

</div>

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
