我需要一种同步执行某些操作的方法,该操作应在半秒内完成,但可能只停留几分钟。如果超时,我不在乎结果。这是我现在正在使用编译器生成的委托。BeginInvoke:
static void Main()
{
bool disposed = false;
var wait = new ManualResetEvent(false);
var a = new Action(
() =>
{
Thread.Sleep(1000); // <- some looong action
if (!disposed)
lock (wait)
if (!disposed)
wait.Set();
});
a.BeginInvoke(a.EndInvoke, null);
bool success = wait.WaitOne(500);
Console.WriteLine(success ? "success" : "timeout");
lock (wait)
{
wait.Dispose();
disposed = true;
}
Console.ReadLine();
}
看起来很丑。而且我知道 lambda 闭包的disposed
变量已被修改(与我的 ReSharper 不同,我喜欢这个 C# 功能)。都是因为我想处置ManualResetEvent
。你能在 .NET4 中提出更好的方法吗?也许我应该跳过处理事件并依赖 GC?
注意事项:ManualResetEvent.Set()
如果您尝试在已处置的实例上执行此操作,则会爆炸。