什麼是正確的Rx擴展方法(在.NET中)持續生成N秒的事件?Rx擴展可以持續生成N秒的事件嗎?
通過「保持生成事件N秒」我的意思是,這將保持自DateTime.Now直到DateTime.Now + TimeSpan.FromSeconds循環產生的事件(N)
我工作的遺傳算法這將產生大量假設,並將最成功的假設傳播給下一代。需要用一些優雅的方式來約束這個傢伙。
後來補充:
其實我已經意識到我需要做拉而不是推,來到-了這樣的事情:
public static class IEnumerableExtensions
{
public static IEnumerable<T> Pull<T>(this IEnumerable<T> enumerable, int? times = null)
{
if (times == null)
return enumerable.ToArray();
else
return enumerable.Take(times.Value).ToArray();
}
public static IEnumerable<T> Pull<T>(this IEnumerable<T> enumerable, TimeSpan timeout, int? times = null)
{
var start = DateTime.Now;
if (times != null) enumerable = enumerable.Take(times.Value);
using (var iterator = enumerable.GetEnumerator())
{
while (DateTime.Now < start + timeout && iterator.MoveNext())
yield return iterator.Current;
}
}
}
和使用將是:
var results = lazySource.SelectMany(item =>
{
//processing goes here
}).Pull(timeout: TimeSpan.FromSeconds(5), times: numberOfIterations);
喬恩像往常一樣在現場;您還可以使用Observable.Create製作自定義流。另外,如果在控制流上沒有信號超時窗口超時,超時也會拋出。 – JerKimball
@JerKimball:啊,但如果原始流仍在生成,它不會拋出(並停止流)?在這種情況下,它不會很好... –
由於答案可能是正確的 - 我突然意識到,在我的具體情況下,使用「拉」而不是「推」更好,因爲它感覺更自然不斷推動處理管道的假設,而不是推動訂閱。但你的回答肯定幫助我理解我真正想做的事情! – IlliakaillI