2
A
回答
4
試試這個讓讀鍵可觀察到的序列:
IObservable<System.ConsoleKeyInfo> keys =
Observable
.Defer(() =>
Observable
.Start(() =>
Console.ReadKey()))
.Repeat();
我測試這和它的工作就像一種享受。
0
我看不到任何方式如何異步讀取按鍵,所以我認爲你必須在一個單獨的線程使用同步Console.ReadKey()
,與Subject<T>
一起。喜歡的東西:
IObservable<ConsoleKeyInfo> ObserveKeysUntilEscape()
{
var keys = new Subject<ConsoleKeyInfo>();
Task.Run(
() =>
{
ConsoleKeyInfo key;
do
{
key = Console.ReadKey();
keys.OnNext(key);
} while (key.Key != ConsoleKey.Escape);
keys.OnCompleted();
});
return keys;
}
0
從@svick的替代方法是將ReadKey
循環作爲Enumerable
,並轉換爲Observable
。這將其置於後臺。
static IEnumerable<ConsoleKeyInfo> KeyPresses()
{
ConsoleKeyInfo key;
do
{
key = Console.ReadKey();
yield return key;
} while (key.Key != ConsoleKey.Escape);
}
我們可以生成線程池的觀測:
var keys = KeyPresses().ToObservable(System.Reactive.Concurrency.Scheduler.ThreadPool);
keys.Subscribe(key => Console.WriteLine("Pressed: {0}", key.Key));
,等待主線程上的Escape
鍵:
keys.Where(key => key.Key == ConsoleKey.Escape).First();
3
ReadKey的阻塞版本()有一個問題,因爲如果你處理訂閱,它仍然會提示你按下一個鍵。
如果您想要取消訂閱,即可以取消提示,那麼(不幸的是)需要使用輪詢方法。
Observable.Interval(TimeSpan.FromMilliseconds(100))
.Where(_ => Console.KeyAvailable)
.Select(_ => (char)Console.ReadKey(false).Key)
你現在可以做很酷的事情像這個Amb
流與Observable.Timer
設置爲按鍵超時。
相關問題
- 1. 檢測上的IObservable
- 2. IObservable - 替換AutoResetEvent
- 3. 如何將IObservable <IObservable <T>>轉換爲IObservable <IEnumerable <T>>?
- 4. 轉換的IObservable <MyObject>到的IObservable <bool>
- 5. 吞嚥IObservable異常
- 6. 從IObservable填充ReactiveCollection
- 7. IObservable REST客戶端
- 8. 反應擴展:從的IObservable
- 9. 的IObservable TakeLast(n)和阻塞
- 10. StreamInsight中的IObservable/IObserver模型
- 11. ManualResetEvent到IObservable <bool>(或WaitHandle到IObservable <Unit>)?
- 12. Rx IObservable - 返回第一個IObservable流以獲取值
- 13. 按鍵事件或按鍵事件中的其他按鍵更改按鍵
- 14. 在Silverlight 4中的IObservable:類型或命名空間無法找到IObservable
- 15. 有沒有更簡單的方法讓IObservable異步依賴另一個IObservable?
- 16. 如何按鍵盤上的按鍵就像按另一個鍵?
- 17. 使用IObservable與統一
- 18. RX IObservable作爲管道
- 19. 何時使用ISourceBlock或IObservable
- 20. IHttpAsyncHandler和IObservable web請求
- 21. 從頂部排出IObservable
- 22. IObservable模糊引用錯誤
- 23. 激活php的按鍵與按鍵
- 24. 按鍵時按鍵找到關鍵字
- 25. 按鍵模擬鍵盤按下「Shift」鍵
- 26. 拍攝快照的的IObservable <T>
- 27. 轉換XML的URL的IObservable <XDocument>
- 28. 區分按下按鍵和按鍵
- 29. 在不按鍵盤按鍵的情況下觸發鍵盤按鍵事件
- 30. 按鍵的鍵盤腳本
如果我訂閱了兩個處理程序,只有其中一個處理每個事件(隨機,每個事件)。這不是我所期望的,我期望這兩個處理程序每個接收每個事件 –
'keys.Subscribe(x => Console.Write(「1」,x.Key)); keys.Subscribe(x => Console.Write (「0」,x.Key)); Thread.Sleep(-1);'然後鍵入'abc'我看到「a1b1c0」而不是「a1a0b1b0c0c1」 –
更正:而不是a10b10c01 –