在ASP.NET 3.5中,我们怀疑由“Timer”触发的委托将阻止其他方法调用。从日志中,一些函数调用将等待委托的完成并继续工作。
这是真的吗?如果是,我可以采取哪些解决方法?
PS:委托包含使用WCF检索数据的代码和以下代码
private void Replace<T>(ref IList<T> src, IList<T> des)
{
lock(src)
{
while (src.Count > 0)
{
GC.SuppressFinalize(src.ElementAt(0));
src.RemoveAt(0);
}
GC.SuppressFinalize(src);
src = des;
}
}
非常感谢。
答案 0 :(得分:1)
这取决于您使用的Timer
实施 - 至少有三个。如果你使用的Timer
只是在没有同步对象的线程池上触发,那么它应该不是问题。
当然,您在调用期间锁定的事实将阻止锁定同一对象的任何其他内容。
答案 1 :(得分:0)
这与您的具体问题无关,但代码中的GC.SuppressFinalize
调用对我来说是一个巨大的危险信号。由于其预期目的,其使用通常仅限于IDisposable
接口的实现。你在这里使用它的方式可能导致资源泄漏。请阅读Implementing Finalize and Dispose to Clean Up Unmanaged Resources以获取更多信息。