C# 更好的同步操作超时检测

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( () => {

我需要一种同步执行某些操作的方法,这些操作应该在半秒钟内完成,但可能只需要等待几分钟。如果它超时,我不在乎结果。下面是我现在正在使用编译器生成的delegate.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();
}
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()可以处理它。如果等待超时,你就不能调用它。不用麻烦了,内核事件与你一直运行的线程相比是非常便宜和微不足道的。