問題タブ [async-workflow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
332 参照

f# - Task.ContinueWith に相当する F# Async

大規模な .NET ソリューションの一部に属性を実装してい[<Trace>]ます。これにより、構成可能な分析を、重要と見なされる関数/メソッドに簡単に追加できるようになります。Fody とMethodBoundaryAspectを使用して、各関数の入口と出口をインターセプトし、メトリックを記録しています。これは、同期関数に対してはうまく機能し、メソッドが を返すTask場合は で実行可能な解決策がありますTask.ContinueWithが、F# Async を返す関数のOnExit場合、Async が実際に実行されるときではなく、Async が返されるとすぐに MethodBoundaryAspect の が実行されます。

F# Async を返す関数の正しいメトリクスを取得するために、 を使用するのと同等のソリューションをTask.ContinueWith考え出そうとしましたが、考えられる最も近い方法は、最初の Async をバインドし、メトリクスを実行する新しい Async を作成することでした-関数をキャプチャし、元の結果を返します。これは、私がインターセプトしている F# Async の戻り値が としてのみ提示されるという事実によってさらに複雑になりますobj。正確な戻り値の型を知っています。AsyncTask

これまでの私の最善の解決策は、おおよそ次のようになります。

残念ながら、この解決策は非常に厄介であるだけでなく、特にループで呼び出された関数や深くネストされた関数をトレースしようとしているときに、非同期計算のリフレクション構造により、自明ではない量のオーバーヘッドが追加されていると思います。非同期呼び出し。非同期計算が実際に評価された直後に、特定の関数を実行するのと同じ結果を達成するためのより良い方法はありますか?