我有以下代碼(爲發佈目的而簡化)。將基於事件的代碼轉換爲Rx
public class SomeDataObject
{
public delegate void ReadyEventHandler;
public delegate void ErrorEventHandler;
public event ReadyEventHandler Ready;
public event ErrorEventHandler Error;
...
}
pubic class ConsumerClass
{
private SomeDataObject dataObject;
private Task<List<string>> GetStrings()
{
List<string> results = new List<string>();
var tcs = new TaskCompletionSource<List<string>>();
SomeDataObject.ReadyEventHandler ReadyHandler = null;
SomeDataObject.ErrorEventHandler ErrorHandler = null;
ReadyHandler +=() =>
{
for (int i =0; i < dataObject.ItemCount; i++)
results.Add(dataObject[i].ToString());
tcs.TrySetResult(results);
}
ErrorHandler +=()
{
tcs.TrySetException(new Exception("oops!");
}
dataObject.Ready += ReadyHandler;
dataObject.Error += ErrorHandler;
dataObject.DoRequest();
}
}
的想法是,當DoRequest調用時,SomeDataObject會得到一些數據,提高或者就緒或錯誤事件(詳細信息並不重要!)。如果數據可用,則ItemCount指示有多少項目可用。
我是Rx的新手,找不到任何可比的例子。那麼是否有可能將此轉換爲Rx,以便使用Observable.Create以某種方式返回IObservable<string>
而不是Task<List<string>>
?
問候 艾倫
你能告訴我們更多關於SomeDataObject API嗎?這似乎有點奇怪。每個實例多次調用DoRequest()是否有效?如果是,可以在現有請求正在運行時撥打電話嗎?它是否設計爲具有單個調用,但與多個消費者共享結果?感覺DoRequest應該返回一個可用於消費結果的句柄(可能是任務或IObservable )。如果出現錯誤,您是否希望能夠再次調用DoRequest()? –
所有這一切都很重要,因爲一旦Observable流發生異常,它不會引發更多的事件 - 所以它可能更好地表示TResult中的錯誤,而不是吹掉可觀察或任務等。 –
James,DoRequest只能被調用一旦。它保持內部狀態。它實際上是我無法控制的外部COM庫的一部分。 –