我刚刚编写了一些代码,以便在异步任务处理时间过长的情况下执行超时操作,但我不清楚是否以及何时会处理超时实例(我认为 它会在异步任务及时完成的情况下发生,但否则我不知道),或者如果我每次调用此代码时都会累积实例。
//StartNew creates a new instance of System.Timers.Timer, and
// invokes the ActionOnTimeout after 2000ms, unless calling code
// calls "Stop" first
var timeout = ProcessTimeout.StartNew(() => ActionOnTimeout(), 2000);
//DoAsyncTask creates a new thread, does potentially slow stuff,
/// then invokes this callback
DoAsyncTask(() =>
{
if(timeout.Running)
{
timeout.Stop();
DoCallbackStuff();
}
});
(如果有帮助的话,ProcessTimeout 类使用 System.Timers.Timer
)
最佳答案
尚不清楚这里的 timeout 是什么或 DoAsyncTask 的作用是什么,但有一些一般性的要点:
- 您的 lambda 表达式将捕获
超时
变量。它不会捕获变量的值...因此,如果您稍后在同一方法中将timeout
设置为null或其他值,则原始值值不会保存在 lambda 表达式中。 - 只要委托(delegate)本身不符合垃圾回收条件,lambda 表达式就会阻止垃圾回收所指的任何
超时
- 垃圾收集与处置不同。您谈到“何时处理超时实例” - 什么在调用
Dispose
?这不会受到垃圾收集器的影响,除非您依赖终结器为您调用Dispose
。
关于c# - 关闭范围和垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3930292/