sync 式 を使用して 2 つ以上の async 式を同時に実行できます。次に例を示します。
# 3 つの async 関数はすべて実質的に同時に開始されます
Results = sync:
AsyncFunction1() # task 1
AsyncFunction2() # task 2
AsyncFunction3() # task 3
# (順序にかかわらず) 3 つすべてのタスクが完了した後に呼び出されます
MyLog.Print("Done with list of results: {Results}")
次のコードは sync 式の構文を、また付随する図はこの式の 実行 フローを示しています。
expression0
sync:
slow-expression
mid-expression
fast-expression
expression1
sync 式の使用法
sync 式を使用できる場所 |
async コンテキスト |
sync 式の呼び出し時間 |
非同期 |
sync コード ブロックの要件 |
sync 式の本体には、少なくとも 2 つの (複数の式を同時に実行する必要のない) async の式が必要です。 |
sync 式の機能 |
コード ブロック のすべての式を同時に実行し、それらすべてが完了するのを待ってから、sync の後の次の式を実行します。 |
sync 式が完了するタイミング |
sync コード ブロックのすべての式が完了したタイミング。 |
sync の開始後に次の式が開始されるタイミング |
sync コード ブロックのすべての式が完了したタイミング。 |
sync 式の結果 |
その 結果 は、トップレベルの式が指定された順序で実行された各式の結果の タプル です。式の結果にはさまざまな 型 があり、各タプル要素には対応する式の型が含まれます。 |
少なくとも 2 つの トップレベルの式 は async である必要があります。
sync:
AsyncFunction1()
MyLog.Print("Second top level expression")
AsyncFunction2()
MyLog.Print("Third top level expression")
sync:
AsyncFunction1()
# エラー:少なくとも 2 つのトップレベルの式が求められます
トップレベルの式は、ネスティングされている コード ブロック などの複合式の場合もあります。
# sync には、独自のタスクを持つトップレベルの各式を含む
# 複合式が含まれる場合もあります
sync:
block: # task 1
# 番号順に評価されます
AsyncFunction1a()
AsyncFunction1b()
block: # task 2
AsyncFunction2a()
AsyncFunction2b()
AsyncFunction2c()
AsyncFunction3() # task 3
# 基本的に、AsyncFunction1a()、AsyncFunction2a()、および AsyncFunction3() はすべて同時に開始されます
タプルは セルフ スプラッティング 引数 として使用できるため、タプルの結果が含まれている sync 式は引数として直接使用することが可能です。これによって async 引数を同時に評価できるようになり、それらの引数が渡される関数は、sync コード ブロックのすべての式が完了したときに呼び出されます。
# 3 つのコルーチン引数はすべて同時に評価を開始します
DoStuff(sync{AsyncFunctionArg1(); AsyncFunctionArg2(); AsyncFunctionArg3()})
# すべての引数が async である必要はなく、少なくとも 2 つで sync を使用できます
DoOtherStuff(sync{AsyncFunctionArg1(); 42; AsyncFunctionArg2(); AsyncFunctionArg3()})