Orlens入門コンセプト(2)Grainsの作成

11515 ワード

ビルドGrainクラスを実装ためにコードを記述する前に、Visual Studioに新しいターゲットを作成する.NET 4.6.1以降のクラスライブラリアイテムにNuGetパッケージを追加します.Microsoft.Orleans . Orleans CodeGenerator.Build
PM> Install-Package Microsoft.Orleans.OrleansCodeGenerator.Build

Grainインタフェースとクラス
は、 するGrainインタフェースの として された を び すことによって、 に し、 から び される.1つのGrainクラスは、 に されたGrainインタフェースを1つ する.Grainインタフェースのすべてのメソッドは、Taskメソッドの voidまたはTaskタイプ の Tを さなければなりません.
はPresenceサービスの の です.
//an example of a Grain Interface
public interface IPlayerGrain : IGrainWithGuidKey
{
  Task GetCurrentGame();
  Task JoinGame(IGameGrain game);
  Task LeaveGame(IGameGrain game);
}

//an example of a Grain class implementing a Grain Interface
public class PlayerGrain : Grain, IPlayerGrain
{
    private IGameGrain currentGame;

    // Game the player is currently in. May be null.
    public Task GetCurrentGame()
    {
       return Task.FromResult(currentGame);
    }

    // Game grain calls this method to notify that the player has joined the game.
    public Task JoinGame(IGameGrain game)
    {
       currentGame = game;
       Console.WriteLine(
           "Player {0} joined game {1}", 
           this.GetPrimaryKey(),
           game.GetPrimaryKey());

       return Task.CompletedTask;
    }

   // Game grain calls this method to notify that the player has left the game.
   public Task LeaveGame(IGameGrain game)
   {
       currentGame = null;
       Console.WriteLine(
           "Player {0} left game {1}",
           this.GetPrimaryKey(),
           game.GetPrimaryKey());

       return Task.CompletedTask;
   }
}

Grainメソッドから を す
Grainがタイプの を す Tは、 されたGrainインタフェースで1つのTaskを す.Grainキーワードタグが されていないメソッドでは、 り が な 、 、 の で されます.
public Task GrainMethod1()
{
    ...
    return Task.FromResult();
}

asyncは を さず、 な の であり、 されたGrainのインタフェースではGrainを す. りTask は、 およびメソッドの を す.Taskキーワードタグが されていないメソッドの 、「void」メソッドの が すると、 な Grainを す があります.
public Task GrainMethod2()
{
    ...
    return Task.CompletedTask;
}
asyncタグ け Task.CompletedTask り :
public async Task GrainMethod3()
{
    ...
    return ;
}

「void」とマークされたメソッドGrainは、 に を さない.
public async Task GrainMethod4()
{
    ...
    return;
}

あるasyncメソッドが の メソッド び しからの り Grainを し、 び しのエラー を する がない 、async び しから した り をその り として に することができる.
public Task GrainMethod5()
{
    ...
    Task task = CallToAnotherGrain();
    return task;
}

に、「void」Grainメソッドは、Grainを つのではなく、 の び しによって すことができる.
public Task GrainMethod6()
{
    ...
    Task task = CallToAsyncAPI();
    return task;
}

GrainリファレンスTask は、 するGrainクラスとして じエージェントオブジェクトTaskインタフェースを することである.ターゲットの (タイプと のキー)Grainがカプセル されています.1つのGrain は、ターゲット び しGrainを するために される. Grainリファレンスは、 Grain(クラスの インスタンスGrain)について されますが、 じリファレンスに して の したリファレンスGrainを できます.Grainは、ターゲットを す アイデンティティGrainを するため、ターゲットの Grainとは しており、システムが に された も である. はGrain のように することができる.NETオブジェクトと に を します.メソッドの り などとして され、 なストレージに されるメソッドに すことができます.
Grain は、 されたアイデンティティによってGrain Grain を ることができ、ここでGrainGrainインタフェースおよびGrainFactory.GetGrain(key)が の Tであるタイプ である.
で したGrainkeyインタフェースの を する の を に します.Grainクラス :
    //construct the grain reference of a specific player
    IPlayerGrain player = GrainFactory.GetGrain(playerId);
Grainクライアントコードから.
1.5.0より :
    IPlayerGrain player = GrainClient.GrainFactory.GetGrain(playerId);

1.5.0のため:
    IPlayerGrain player = client.GetGrain(playerId);

Grainメソッド び し
このIPlayerGrainプログラミングモデルは、 プログラミングと および に づいている.Grainの の の を して、Orleansメソッド び しを する を に します.
//Invoking a grain method asynchronously
Task joinGameTask = player.JoinGame(this);
//The await keyword effectively makes the remainder of the method execute asynchronously at a later point (upon completion of the Task being awaited) without blocking the thread.
await joinGameTask;
//The next line will execute later, after joinGameTask is completed.
players.Add(playerId);

2つ のOrleansを する があります. により、 しいGrainが され、そのすべての Grainの が すると されます.これは、Tasksが の を し、 する にすべての が するのを つ がある に なモードである. えば、Taskは、 の からなるウェブページのフロントエンドを し、 が1つずつ、およびTaskは のために1つを する のバックエンドコールを うことができる.これらのすべてのGrainへの は、Grainに く. Taskが されると、 Grainは し、ウェブページのフォーマットに なすべてのデータが される.
:
List tasks = new List();
Message notification = CreateNewMessage(text);

foreach (ISubscriber subscriber in subscribers)
{
   tasks.Add(subscriber.Notify(notification));
}

// WhenAll joins a collection of tasks, and returns a joined Task that will be resolved when all of the individual notification Tasks are resolved.
Task joinedTask = Task.WhenAll(tasks);
await joinedTask;

// Execution of the rest of the method will continue asynchronously after joinedTask is resolve.

メソッド
1つのTasksクラスは、オプションとして、TaskおよびTask メソッドを きすることができ、これらのメソッドGrainは、 OnActivateAsyncクラスのアクティブ および アクティブ にランタイムによって び される.これにより、OnDeactivateAsyncコードは、 の およびクリーンアップ を する をもたらす.Orleansアクティブ プロセスの による .Grainが きされると、 にGrainアクティブ プロセスの として び されるが、OnActivateAsyncは、すべての 、 えばサーバ または の イベントの に び されることを することはできない.したがって、アプリケーションはOnDeactivateAsyncに して な を するべきではありません.たとえば、ステータス の は、 の にのみ できます.

お の