搶先看 Async Stream 的最終章,在非 C# 8.0 的環境下也能寫出類似的效果。
如果編譯器本身不支援 C# 8.0 的 Async Stream,還是可以做出類似的效果,這種方式稱之為 push model,前述三篇文章所使用的方式都是 pull model。
push model 很神奇嗎?在 C# 中其實也不過就是 Observer Pattern (觀察者模式) 的應用而已, 不囉嗦,我們直接看程式碼:
public class DelegateProcess
{
async static public Task ReadLineAsync(string path, Action<string> action)
{
using (StreamReader reader = File.OpenText(path))
{
while (await reader.ReadLineAsync() is string result)
{
action.Invoke(result);
await Task.Delay(100);
}
}
}
}
道理說穿了,不過就是把外部要執行的動作以 Action<string> 委派的形式當作參數傳遞。所以外部會這樣呼叫:
await DelegateProcess.ReadLineAsync(path, (x) => Console.WriteLine(x));
解決問題的方法有很多,端看甚麼情境應用甚麼樣的方式來解決而已。整個 Async Stream 的 Sample Code 可以參考我的 github :AsyncStreamReadLineSample 。