2016-02-25 26 views
0

System.Threading.Timer类具有重写Dispose,其中需要WaitHandle。这个想法一旦所有的定时器回调完成,它会设置等待句柄,并且你知道关闭是安全的。在WaitHandle上设置事件

不幸的是,WaitHandle类没有设置事件的方法。通过源代码查看Kernal32中的导入来设置事件。

是否有一个框架友好的方法来设置一个WaitHandle?所有的例子都使用WaitHandle的一个特定的实现,它已经有了一个set方法。似乎有些荒谬,基类上没有Set或类似的东西。它存在于下面的一个级别的EventWaitHandle上。

+0

这是关于Timer的问题吗?或者这只是一个例子吗? – usr

+0

'WaitHandle'是一个抽象类。你不能直接使用它,你可以使用它的具体子类之一。 –

+0

重点是System.Threading.Timer的Dispose需要WaitHandle,然后使用DllImport来设置它上面的事件。这是基类的要点,它允许你传入任何实现。 – Ian

回答

0

我允许我的方法中的EventWaitHandle作为基类型,它允许我发信号通知我的关闭已完成。

现在这样做的方法是公开一个Task,当你想要发信号时就会完成。不需要句柄(在.NET中大多数都是过时的),并且不需要传递任何结构上很笨拙的东西。

A Task就像一个事件,但更好,更轻量。

+1

不是一个缺陷,它不能决定你使用ARE还是MRE。 –

+0

你是什么意思?如果我正确读取了代码,它会在互斥体上调用SetEvent。 – usr

+0

您没有正确阅读。 AutoResetEvent和ManualResetEvent是Windows内核事件对象的.NET包装器。使用CreateEvent()winapi函数创建的类型。 –