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
を ることができ、ここでGrain
はGrain
インタフェースおよびGrainFactory.GetGrain(key)
が の T
であるタイプ である.
で したGrain
のkey
インタフェースの を する の を に します.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に して な を するべきではありません.たとえば、ステータス の は、 の にのみ できます.
の
お の