Concurrent Basicは、見込まれるVisual Basicの将来を表す。Polyphonic C#およびC-OmegaなどのC#研究言語で実行される作業に基づいているけれども、Visual Basicは宣言型プログラミングの本来備わっている傾向のため、白羽の矢が立った。その構文は、VBの宣言型イベントハンドラによって着想される。
キーワード
- Asynchronous – メッセージキューを表すメソッド。
- Synchronous – リクエストキューを表すメソッド。
- When – AsynchronousおよびSynchronousイベントを相互につなぐために使用。
以下は、上記のキーワードを使用して実装されるスレッドセーフなバッファの完全なリストである。
Class Buffer(Of T) Asynchronous Sub Put (t as T) Synchronous Function Take() as T Function React (t as T) as T When Put, Take Return T End Function End Class
関数Putは、非同期に呼び出すことができる。Take関数は、最低1つの保留Putが存在するまでブロックする。React関数は、Putを通じてキューされたオブジェクトを、Takeが期待するフォームに変換するという実装の詳細を扱う。
以下は、その2つの例である。最初の例はAまたはBにおいて、メッセージを待機する。2番目の例は、AおよびBの両方でメッセージがある限り待機する。
Class Either(Of T) Asynchronous Sub PutA(t as T) Asynchronous Sub PutB(t as T) Synchronous Function TakeEither() as T Function ReactA(t as T) as T When TakeEither, PutA Return T End Function Function ReactB(t as T) as T When TakeEither, PutB Return T End Function End Class Class Both(Of T, U) Asynchronous Sub PutA(t as T) Asynchronous Sub PutB(u of U) Synchronous Function TakeBoth() as T Function React(t as T, u as U) as Pair(Of T, U) When Take, PutA, PutB Return new Pair(Of T, U)(t, u) End Function End Class
次は、1つの場所のバッファに対するパターンであり、最大で同時に1つのメッセージを格納するバッファである。
Class OPB(of T) Sub New Empty() End Sub Synchronous Sub Put (t as T) Synchronous Function Take() as T Private Asynchronous Empty() Private Asynchronous Full(of T) Sub PutAndEmpty(t as T) When Put, Empty Full(t) End Sub Sub TakeAndFull(t as T) as T When Take, Full Empty() Return t End Sub End Class
Put、Take、EmptyおよびFullは内部キューを表す。応答メソッドはWhenクラスとキューのサイズが一致するパターンで実行される。
これまで、それぞれの例はTakeメソッドが同期であることを前提としていた。しかしながら、そうである必要はなく、コールバックを使用することもできる。
Class AsyncBuffer(Of T) Asynchronous Sub Put (t as T) Asynchronous Function Take() as T Function React (callback as Func(t as T), t as T) as T When Put, Take Return callback(t) End Function End Class
このモデルを使用して、スレッドはReactおよびコールバック機能の処理をする。スレッドプール、GUIスレッドまたは他のスレッドライブラリなど別のことをしたいと考える人もいるかもしれない。そのためには、ContinuationAttributeを実装する必要がある。以下は、属性のベースクラスである。
Public MustInherit Class ContinuationAttribute Inherits Attribute Public MustOverride Sub BeginInvoke( task As Continuation) Public MustOverride Sub Invoke( task As Continuation) End Class Public Delegate Sub Continuation()
例および使用
Public Class MyThreadPoolAttribute Inherits ContinuationAttribute Public Overrides Sub BeginInvoke( task As Continuation) ThreadPool.Enqueue(task) End Sub Public Overrides Sub Invoke( task As Continuation) task() End Sub End ClassClass AsyncBuffer(Of T)
Asynchronous Sub Put (t as T)
Asynchronous Function Take() as T
Function React (callback as Func(t as T), t as T) as T When Put, Take
Return callback(t)
End Function
End Class
詳しくは、Channel 9のビデオ(リンク)およびConcurrent Basicの提案(PDF)を参照のこと。