Tag: .net

具有支持multithreading的限制的异步任务的队列

我需要实现一个库来请求vk.com API。 问题是API每秒只支持3个请求。 我想让API异步。 重要提示: API应支持从多个线程安全访问。 我的想法是实现一些名为throttler的类,它允许不超过3个请求/秒并延迟其他请求。 接口是下一个: public interface IThrottler : IDisposable { Task Throttle(Func<Task> task); } 用法就像 var audio = await throttler.Throttle(() => api.MyAudio()); var messages = await throttler.Throttle(() => api.ReadMessages()); var audioLyrics = await throttler.Throttle(() => api.AudioLyrics(audioId)); /// Here should be delay because 3 requests executed var photo = await throttler.Throttle(() => […]

INotifyPropertyChanged与DependencyProperty

我需要观察属性的变化。 在性能和内存使用方面哪种方法更好:实现INotifyPropertyChanged或使用DependencyProperty ? 注意:是的,我在ViewModel中已经阅读了另一个问题INotifyPropertyChanged与DependencyProperty 。

是否有IEnumerable实现只迭代它的源(例如LINQ)一次

提供的items是q LINQ表达式的结果: var items = from item in ItemsSource.RetrieveItems() where … 假设每个项目的生成需要一些不可忽略的时间。 有两种操作模式: 使用foreach将允许开始使用集合开头的项目,而不是最终可用的项目。 但是,如果我们想稍后再次处理相同的集合,我们将不得不复制保存它: var storedItems = new List(); foreach(var item in items){ Process(item); storedItems .Add(item); } // Later foreach(var item in storedItems){ ProcessMore(item); } 因为如果我们只是做了foreach(… in items)那么temsSource.RetrieveItems()将再次被调用。 我们可以在前面使用.ToList() ,但这会迫使我们在开始处理第一个项目之前等待检索最后一个项目。 问题 :是否存在IEnumerable实现,它将像常规LINQ查询结果一样首次迭代,但会在进程中实现,以便第二个foreach将迭代存储的值?

你如何使用LINQ与Sqlite

有人会解释如何让LINQ使用Sqlite。

WCF中的mex绑定错误

我正在使用VSTS 2008 + C#+ .NET 3.0。 我正在使用自托管的WCF服务。 执行以下语句时,会出现以下“未找到绑定”错误。 我已经发布了我的整个app.config文件,任何想法有什么问题? ServiceHost host = new ServiceHost(typeof(MyWCFService)); 错误信息: 无法通过绑定MetadataExchangeHttpBinding找到与端点的方案http匹配的基址。 注册的基地址方案是[https]。 完整的app.config:

可以调用Assembly.Load(byte )来引发AppDomain.AssemblyResolve事件吗?

假设我有一个AppDomain.AssemblyResolve事件的处理程序,并在处理程序中我构造一个字节数组并调用方法Assembly.Load(byte[]) 。 此方法本身是否会导致再次引发AssemblyResolve事件,并导致我的处理程序重新进入? 我的问题不仅限于可以使用C#编译器生成的程序集,它们可以包含CLR支持的abritrary元数据和可执行代码。 我做了一些实验,发现时没有发现任何情况。 我试图加载需要额外引用的程序集,试图将CAS属性添加到加载的程序集,其解码需要另一个程序集,尝试使用模块初始化程序(全局.cctor方法)加载程序集。 在任何情况下,我都没有观察到AssemblyResolve事件是从Assembly.Load(byte[])方法内部引发的,只有在某些代码稍后尝试访问加载的程序集中的类型,方法或属性时才会发生。 但我可能会在这里遗漏一些东西。

如何计算标准差

double[] someDoubles = { 34.6, 45.1, 55.5, 78.5, 84.66, **1400.32**, 99.04, 103.99 }; 上面的代码是累积算法的意外行为的简短样本(请参阅粗体值)。 实际上,这是一个类,它还包含每个值的日期。 C#计算偏差? 解析打破累积链的行的算法? 建议有帮助, [插入] 澄清一下,这是关于三件事 在这个主题上,性能非常重要。 第一种:如果值遵循累积模式,则快速扫描。 第二:检查所有值是否合理偏差。 第三:指出并进行error handling。 这个问题是关于第一个和第二个问题。

我怎样才能摆脱废弃的互斥体?

摘要: 有没有办法清除互斥锁,如果创建它的过程已经死了又消失了? 细节: 我使用互斥锁来确保我的应用只运行一个实例。 在测试一些新代码(进行自动更新)时,我运行了Environment.Exit(0)。 在调试模式下运行时,我的互斥锁被清理干净了。 但是当我将构建更改为“Release”时,互斥体会在退出调用后保持不变并被标记为已放弃: 我已经进行了双重检查,以确保没有一个进程仍在运行,这个互斥锁被连接到了。 现在每次运行我的应用程序时,它都认为互斥锁仍然存在,并且不会启动我的应用程序。 (它也崩溃了,因为它试图向应用程序的“当前运行”实例发送消息以显示自己。) 我试图像这样释放互斥锁: bool createdNew; string applicationId = “18773:TestStudio”; var singleInstanceMutex = new Mutex(true, applicationId, out createdNew); singleInstanceMutex.Close(); // Tried ReleaseMutex() too 但当然只是得到它然后释放它。 我知道我可以重新启动,但我正在寻求一个更好的解决方案,以防生产中发生这种情况。 有没有办法清除互斥锁,如果创建它的过程已经死了又消失了?

C#是否包含有限状态机?

我最近读过boost::statechart库(有限状态机),我很喜欢这个概念。 C#有类似的机制吗? 或者可以使用特定的设计模式实现?

我们需要在multithreading代码中读取.NET Int32时锁定它吗?

我正在阅读以下文章: http : //msdn.microsoft.com/en-us/magazine/cc817398.aspx “解决你的multithreading代码中的11个可能的问题”作者:Joe Duffy 它提出了一个问题:“我们需要在multithreading代码中读取它时锁定.NET Int32吗?” 据我所知,如果它是32位SO中的Int64,它可能会撕裂,正如文章中所解释的那样。 但对于Int32,我想到了以下情况: class Test { private int example = 0; private Object thisLock = new Object(); public void Add(int another) { lock(thisLock) { example += another; } } public int Read() { return example; } } 我没有看到在Read方法中包含锁的原因。 你呢? 更新基于答案(由Jon Skeet和ctacke提供)我理解上面的代码仍然容易受到多处理器缓存的影响(每个处理器都有自己的缓存,与其他处理器不同步)。 所有这三个修改都解决了这个问题: 添加“int example”的“volatile”属性 插入Thread.MemoryBarrier(); 在实际读取“int example”之前 在“lock(thisLock)”中读取“int […]