Akka.NETのサンプルを動かしてみる（Visual Studio編）

#まえがき
社内の勉強会でReactive Systemのオハナシを聴いてAkkaというものの存在を知ったけど、
.NETerな私には正直無縁なのかな？と思っていました。

でも、Akkaの公式サイトを見たら.NET Framework/Mono版の
**Akka.NET**というのがあるとのこと。
http://getakka.net/

*Get Started Now* を試してみたら案外アッサリ動いたのでメモを残しておきます。

##必要環境
* Windows OS搭載のPC
* Visual Studio 2013/2015（NuGet Package Managerが動作する環境）

##実際の検証環境
* Windows 7 Professional 64bit
* Visual Studio 2013 Community

#Get Started Nowの解説
##プロジェクトのセットアップ
1. 新規プロジェクトの作成
C#のコンソールアプリケーションを作成します。
![AkkaSample001.png](https://qiita-image-store.s3.amazonaws.com/0/49240/0a62687f-c738-a9d8-524f-745ed0f4cde1.png)

2. NuGet Package Managerの起動
（最初どこから起動するのかわからなかった・・・）
![AkkaSample002.png](https://qiita-image-store.s3.amazonaws.com/0/49240/bccf302a-0297-3f26-abc4-185852f0ea70.png)

3. Akka.NETのインストール
Install-Packageコマンドでインストールします。
![AkkaSample003.png](https://qiita-image-store.s3.amazonaws.com/0/49240/8dbb39a9-7f85-25ff-2ba6-940f71cb1082.png)

```ps1:
PM> Install-Package Akka
```

##Usingステートメントの追加
*Akka* と *Akka.Actor* を追加します。

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// 2行を追加
using Akka;
using Akka.Actor;

namespace GetStartedNowCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
```
##メッセージを定義する
アクターへ送るメッセージの型 *Greet* を定義します。

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Akka;
using Akka.Actor;

namespace GetStartedNowCSharp
{
    // メッセージ型
    public class Greet
    {
        public string Who { get; private set; }

        public Greet(string who)
        {
            Who = who;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
```

##アクターを定義する
メッセージ *Greet* を受け取るアクター *GreetingActor* を定義します。

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Akka;
using Akka.Actor;

namespace GetStartedNowCSharp
{
    public class Greet
    {
        public string Who { get; private set; }

        public Greet(string who)
        {
                Who = who;
        }
    }

    // アクターの定義
    public class GreetingActor : ReceiveActor
    {
        public GreetingActor()
        {
            Receive<Greet>(greet =>
                Console.WriteLine("Hello {0}", greet.Who));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
```
##アクターシステムとアクターを生成し、アクターへメッセージを送る
クラス *Program* のMainメソッドで以下の処理を行います。
1. アクターシステムを生成
2. 手順1で生成したアクターシステムを利用して、アクター *GreetingActor* を生成する
3. メッセージを送信する（Tell）

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Akka;
using Akka.Actor;

namespace GetStartedNowCSharp
{
    public class Greet
    {
        public string Who { get; private set; }

        public Greet(string who)
        {
            Who = who;
        }
    }

    public class GreetingActor : ReceiveActor
    {
        public GreetingActor()
        {
            Receive<Greet>(greet =>
                Console.WriteLine("Hello {0}", greet.Who));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // アクターシステムの生成
            var system = ActorSystem.Create("MySystem");
            // アクターシステムからアクターを生成
            var greeting = system.ActorOf<GreetingActor>("greeting");

            // アクターへメッセージ送信
            greeting.Tell(new Greet("World"));
            greeting.Tell(new Greet("黒猫"));

            // 非同期処理が完了する前にコンソールが終了するのを防止する
            Console.ReadLine();
        }
    }
}
```
※最後の *Console.ReadLine()* は、アクターが処理を完了する前にコンソールが終了しないようにするためのもの。

##結果
![AkkaSample004.png](https://qiita-image-store.s3.amazonaws.com/0/49240/3bb8c279-9522-f608-52fb-0728604a8909.png)

#あとがき
そもそもAkkaを概要でしか知らないので、誤っているところがあるかもしれません。
試してみる方はご注意ください。
また公式サイト *Get Started Now* のコードをほぼそのまま持ってきていますが、
ライセンス的に問題がある場合は本記事を削除します。

Monoでも動作する、ということですので
時間があったらLinuxなりMacでAkka.NETが使えるか試してみたいです。