---
title: F#でちょっとずつ返す
tags:  #fsharp  
author: [Tsumiki](https://convert.docswell.com/user/tsu-miki)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/PERGDQ6K79.jpg?width=480
description: F#で非同期ストリームを扱った話
published: December 23, 25
canonical: https://convert.docswell.com/s/tsu-miki/KEY216-fsharp-async-streaming
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/PERGDQ6K79.jpg)

F# でちょっとずつ返す


# Page. 2

![Page Image](https://bcdn.docswell.com/page/P7XX15M57X.jpg)

ちょっとずつ返す？


# Page. 3

![Page Image](https://bcdn.docswell.com/page/37KW26GR7D.jpg)

ちょっとずつ返す？
Request
Request
DAG API
(F# Minimal API)
Streaming
Response
LLM
(Gemini)
Streaming
Response


# Page. 4

![Page Image](https://bcdn.docswell.com/page/LJ3146NGE5.jpg)

ちょっとずつ返す？
SCAI API
DAG API
(F# Minimal API)
LLM
(Gemini)


# Page. 5

![Page Image](https://bcdn.docswell.com/page/8JDXQVWN7G.jpg)

選択肢
1. Server-Sent Events ( SSE )
2. IAsyncEnumerable&lt;T&gt; の活用
a. 非同期ストリームを表現するための .NET の標準的なインターフェース


# Page. 6

![Page Image](https://bcdn.docswell.com/page/VEPPLV9NE8.jpg)

Server-Sent Events
● サーバーからクライアントへ一方向にデータを逐次PushするW3C標準の通信方式
MDN: https://developer.mozilla.org/ja/docs/Web/API/Server-sent_events


# Page. 7

![Page Image](https://bcdn.docswell.com/page/27V2QZMY7Q.jpg)

IAsyncEnumerable&lt;T&gt;
● 非同期ストリームを表現するための .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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/5JGRW4GW7L.jpg)

DAG API では？
●
IAsyncEnumerable&lt;T&gt;
TaskSeq を使った実装
○
●
理由
○
.NET 標準機能で実装可能
■
○
SSE は .NET 8 だと標準サポートがない
ブラウザ向けではない
■
だいたいのプログラミング言語、HTTPクライアントライブラリで標準的にサ
ポートされている


# Page. 9

![Page Image](https://bcdn.docswell.com/page/47QV3GXQEP.jpg)

ポイント
DAG API
③
Entry Point
②
①
Driver


# Page. 10

![Page Image](https://bcdn.docswell.com/page/KE4M156Y71.jpg)

ポイント
1. Driver で逐次データを受け取る
2. Driver から アプリケーション構成レイヤーまで逐次データを返す
3. HTTP レスポンスとしてクライアントへ逐次データを返す


# Page. 11

![Page Image](https://bcdn.docswell.com/page/L718GWVNJG.jpg)

実装例


# Page. 12

![Page Image](https://bcdn.docswell.com/page/G7WZK63M72.jpg)

ハマった箇所
● do! Task.Yield() や Task.Delay() を入れないと逐次データが返ってこない
○
まとめて返ってくる


# Page. 13

![Page Image](https://bcdn.docswell.com/page/4JZ1ZYVME3.jpg)

図解
HTTPフレームワーク (ASP.NET Core)
TaskSeq(F#)
MoveNextAsync() を呼ぶ
要素を受け取る
要素を生成 (yield line)
制御をHTTPフレームワークに戻す
明示的な非同期一時停止 (do!
Task.Yield())
HTTPレスポンスに逐次書き出し（フラッシュ）


# Page. 14

![Page Image](https://bcdn.docswell.com/page/YE6LZD557V.jpg)

解説
● フラッシュされるタイミングは、HTTPフレームワークが管理している
● 制御を明示的に戻す必要がある
○ Task.Yield(), Task.Delay()


# Page. 15

![Page Image](https://bcdn.docswell.com/page/GE51W3YGJ4.jpg)

おわり


