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
tsumiki
November 08, 2025
Programming
20
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
F#でちょっとずつ返す
F#で非同期ストリームを扱う際の内部的な動き
tsumiki
November 08, 2025
More Decks by tsumiki
See All by tsumiki
おもしろい組織図の世界
tsumiki
0
43
リーダブルコードLT
tsumiki
0
23
メディアリニューアルした話
tsumiki
0
20
Svelte触ってみた
tsumiki
0
16
スピーダ事業 Product Teamの1週間を考察してみた。
tsumiki
0
19
New Joinerの時に感じていたことを振り返る
tsumiki
0
18
F# AsyncとTask
tsumiki
0
20
評価が大事
tsumiki
0
22
Other Decks in Programming
See All in Programming
Flow は今どうなっているか
mizdra
PRO
0
640
AIが無かった頃の素敵な出会いの話
codmoninc
1
470
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
250
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
1.1k
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
250
MySQLとPostgreSQLって何が違うの?
akagami
0
110
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
150
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
580
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
110
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
120
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
230
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
390
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Limits of Empathy - UXLibs8
cassininazir
1
610
The Mindset for Success: Future Career Progression
greggifford
PRO
0
450
Building AI with AI
inesmontani
PRO
1
1.1k
KATA
mclloyd
PRO
35
15k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
480
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
650
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
380
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
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()
おわり