アクターモデルでは、アクターには、たとえばパターンマッチング(言語ofcに応じて)を使用してメッセージがマッチングされる、ある種のメッセージループがあります。
例:疑似F#
let message_loop() =
let! message = receive_message() //sync receive message
match message with
| Foo(a,b) -> DoStuff(a,b)
| Bar(c) -> DoOtherStuff(c)
| _ -> error ("unknown message")
message_loop()
ほとんどの場合、メッセージ署名は一致し、メッセージコンテンツに対して実行するアクションに関連付けられます。
これと実際のメソッドの呼び出しの間に概念的な違いはありますか?たとえば、C#5で次のことを行う場合:
class MyActor
{
//message signature Foo(a,b)
public void Foo(int a,string b)
{
Act( () => DoStuff(a,b) );
}
//message signature Bar(c)
public void Bar(int c)
{
Act( () => DoOtherStuff(c));
}
// the rest is infrasturcture code, can be refactored into an Actor Base class
//this emulates the sync behavior of the above actor
//each action is pushed onto a queue
//and then processed synchronously by the message handler
private void Act(Action action)
{
actions.Post(action);
}
private BufferBlock<Action> actions = new BufferBlock<Action>();
//this needs max degreee of parallellism = 1
private ActionBlock<Action> messageHandler = new ....
}
このように、MyActorでメソッドを呼び出すと、単一の種類のメッセージのみを処理する非同期メッセージがメッセージキューに投稿されます。行動。ただし、メッセージに関連付けられている動作は、メッセージ自体に含まれています(パブリックメソッドから投稿されます)
それで、これはC#5 / Async CTPでアクターを実行するためのクリーンな方法と見なされますか?
利点は、メッセージがクラスのような厄介なメッセージDTOを作成するのではなく、通常のメッセージとして単純に定義されることです。
それで、これはそれを機能させるのに十分でしょうか?