Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
F#でちょっとずつ返す
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
tsumiki
November 08, 2025
Programming
0
4
F#でちょっとずつ返す
F#で非同期ストリームを扱う際の内部的な動き
tsumiki
November 08, 2025
Tweet
Share
More Decks by tsumiki
See All by tsumiki
リーダブルコードLT
tsumiki
0
6
メディアリニューアルした話
tsumiki
0
4
Svelte触ってみた
tsumiki
0
4
スピーダ事業 Product Teamの1週間を考察してみた。
tsumiki
0
5
New Joinerの時に感じていたことを振り返る
tsumiki
0
4
F# AsyncとTask
tsumiki
0
4
評価が大事
tsumiki
0
5
Other Decks in Programming
See All in Programming
Oxlintはいいぞ
yug1224
5
1.4k
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
280
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
310
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
200
並行開発のためのコードレビュー
miyukiw
0
1.1k
CSC307 Lecture 07
javiergs
PRO
1
560
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
120
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
21
7.4k
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.6k
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.4k
CSC307 Lecture 06
javiergs
PRO
0
690
Featured
See All Featured
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
140
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Into the Great Unknown - MozCon
thekraken
40
2.3k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
250
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
54
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
77
Utilizing Notion as your number one productivity tool
mfonobong
3
220
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Un-Boring Meetings
codingconduct
0
200
Transcript
F# でちょっとずつ返す
ちょっとずつ返す?
ちょっとずつ返す? DAG API (F# Minimal API) LLM (Gemini) Request
Request Streaming Response Streaming Response
ちょっとずつ返す? DAG API (F# Minimal API) LLM (Gemini) SCAI
API
選択肢 1. Server-Sent Events ( SSE ) 2. IAsyncEnumerable<T> の活用
a. 非同期ストリームを表現するための .NET の標準的なインターフェース
Server-Sent Events • サーバーからクライアントへ一方向にデータを逐次PushするW3C標準の通信方式 MDN: https://developer.mozilla.org/ja/docs/Web/API/Server-sent_events
IAsyncEnumerable<T> • 非同期ストリームを表現するための .NET の標準的なインターフェース • Chunked transfer encoding (HTTP/1.1で導入されたデータ転送方式)を使用
◦ チャンク形式のHTTPリクエスト ◦ レスポンスヘッダー:Transfer-Encoding: chanked .NET: https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.iasyncenumerable-1?view=net-9.0
DAG API では? • IAsyncEnumerable<T> ◦ TaskSeq を使った実装 • 理由
◦ .NET 標準機能で実装可能 ▪ SSE は .NET 8 だと標準サポートがない ◦ ブラウザ向けではない ▪ だいたいのプログラミング言語、HTTPクライアントライブラリで標準的にサ ポートされている
ポイント Entry Point Driver ① ② DAG API ③
ポイント 1. Driver で逐次データを受け取る 2. Driver から アプリケーション構成レイヤーまで逐次データを返す 3. HTTP
レスポンスとしてクライアントへ逐次データを返す
実装例
ハマった箇所 • do! Task.Yield() や Task.Delay() を入れないと逐次データが返ってこない ◦ まとめて返ってくる
HTTPフレームワーク(ASP.NET Core) TaskSeq(F#) HTTPレスポンスに逐次書き出し(フラッシュ) MoveNextAsync() を呼ぶ 明示的な非同期一時停止 (do! Task.Yield()) 制御をHTTPフレームワークに戻す
要素を受け取る 要素を生成 (yield line) 図解
解説 • フラッシュされるタイミングは、HTTPフレームワークが管理している • 制御を明示的に戻す必要がある ◦ Task.Yield(), Task.Delay()
おわり