什么时候会选择使用Rx而不是TPL,或者2个框架是否正交?
根据我的理解,Rx主要用于提供事件的抽象并允许组合,但它也允许提供异步操作的抽象.使用Createxx重载和Fromxxx重载并通过处理返回的IDisposable取消.
TPL还通过任务和取消功能提供操作抽象.
我的困境是什么时候使用哪种情况?
让我们假设我用来迭代节点列表的代码
foreach(XmlNode nodeP in node.SelectNodes("Property"))
{
propsList.Add(nodeP.Attributes["name"].Value, true);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,表达式node.SelectNodes("Property")是否在每次迭代期间为每个或一次进行评估?
我正在尝试使用多个生产者和一个消费者来实现一个相当简单的生产者/消费者风格的应用程序.
研究让我进入了BlockingCollection<T>有用的领域,并允许我实现一个长期运行的消费者任务,如下所示:
var c1 = Task.Factory.StartNew(() =>
{
var buffer = new List<int>(BATCH_BUFFER_SIZE);
foreach (var value in blockingCollection.GetConsumingEnumerable())
{
buffer.Add(value);
if (buffer.Count == BATCH_BUFFER_SIZE)
{
ProcessItems(buffer);
buffer.Clear();
}
}
});
Run Code Online (Sandbox Code Playgroud)
该ProcessItems函数将缓冲区提交给数据库,并且它可以批量工作.然而,该解决方案是次优的.在男爵生产期间,可能需要一段时间才能填充缓冲区,这意味着数据库已过期.
更理想的解决方案是在30秒计时器上运行任务或foreach在超时时短路.
我跑了计时器的想法,想出了这个:
syncTimer = new Timer(new TimerCallback(TimerElapsed), blockingCollection, 5000, 5000);
private static void TimerElapsed(object state)
{
var buffer = new List<int>();
var collection = ((BlockingCollection<int>)state).GetConsumingEnumerable();
foreach (var value in collection)
{
buffer.Add(value);
}
ProcessItems(buffer);
buffer.Clear();
}
Run Code Online (Sandbox Code Playgroud)
这有明显的问题,foreach将被阻止直到结束,打败计时器的目的.
任何人都可以提供指导吗?我基本上需要BlockingCollection定期快照并处理内容清除它.也许BlockingCollection …
HI,我需要创建在用户本地App数据路径中创建的唯一文件夹名称,我无法使用MD5和其他算法生成文件夹名称,因为结果具有文件夹名称的有效字符.有没有办法从给定的文件路径或名称生成文件夹名称?
我正在开发一个项目,我需要将xml写入文件,这发生在for循环中,
那是
for(int i = 0; i < screens.length; screens++)
{
XMLDocument allScreens = new XMLDocument();
allScreens.Load(allScreeensPath);
XMLNode node = allScreens.Select("//Screen[@name='" + screens[i].name + "']");
allScreens.Remove(node);
allScreens.Add(nweNode);
allScreens.Save(allScreeensPath);
}
Run Code Online (Sandbox Code Playgroud)
基本上,xml文档被访问,修改并保存在for循环中,这项工作有时候.有时我得到以下错误,
我尝试使用文本阅读器,文本编写器来执行文件操作(这样我可以关闭,处理编写器)但错误仍然存在.我怎么能通过这个?