C# 更好的同步操作超时检测
我需要一种同步执行某些操作的方法,这些操作应该在半秒钟内完成,但可能只需要等待几分钟。如果它超时,我不在乎结果。下面是我现在正在使用编译器生成的delegate.BeginInvoke执行的步骤:C# 更好的同步操作超时检测,c#,timeout,threadpool,synchronous,begininvoke,C#,Timeout,Threadpool,Synchronous,Begininvoke,我需要一种同步执行某些操作的方法,这些操作应该在半秒钟内完成,但可能只需要等待几分钟。如果它超时,我不在乎结果。下面是我现在正在使用编译器生成的delegate.BeginInvoke执行的步骤: static void Main() { bool disposed = false; var wait = new ManualResetEvent(false); var a = new Action( () => {
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();
}
static void Main()
{
布尔=假;
var wait=新手动重置事件(错误);
var a=新操作(
() =>
{
Thread.Sleep(1000);//不,您不应该跳过Dispose的调用而依赖GC。这是对资源的浪费,简单明了
在.NET4.0中,我将看一看System.Threading程序集中的,4.0中新增的
具体来说,请查看以及,这将允许您指定超时
此外,您还需要了解如何在它超时的情况下执行此操作。呃,现在我使用编译器生成的委托查看了更多的代码示例。BeginInvoke
我看到它返回IAsyncResult
,它具有AsyncWaitHandle
,这正是我的目标:
var a = new Action(() => Thread.Sleep(1000)); // <- some looong action
IAsyncResult asyncResult = a.BeginInvoke(a.EndInvoke, null);
bool success = asyncResult.AsyncWaitHandle.WaitOne(500);
var a=new Action(()=>Thread.Sleep(1000));//调用BeginInvoke是启动异步操作的方式,而不是同步操作。对,但我希望在超时间隔内同步完成它。是的。但没有真正的区别,只有EndInvoke()可以处理它。如果等待超时,你就不能调用它。不用麻烦了,内核事件与你一直运行的线程相比是非常便宜和微不足道的。