c# - .NET 手动重置事件

标签 c# .net multithreading

在下面的代码中,Main 函数等待设置手动重置事件 (mre)。 然而,在等待开始之前,同步对象已经被其他线程设置为有信号状态。

那么,等待“已经发出信号的同步对象”是否安全?

class Program
{
    static void Main(string[] args)
    {
        ManualResetEvent mre = new ManualResetEvent(false);
        ThreadPool.QueueUserWorkItem(new WaitCallback(Func), mre);
        Thread.Sleep(1500);
        mre.WaitOne(100000); // Waiting for already signaled object
        Console.WriteLine("Wait Completed");
    }

    public static void Func(object state)
    {
        ManualResetEvent mre = (ManualResetEvent)state;
        mre.Set();
        Console.WriteLine("Mre Is Set");
    }
}

最佳答案

是的。如果它已经发出信号,则不会有任何等待完成。没关系。

事实上,如果您查看 WaitOne(int) 的返回值,您会发现如果它已设置(或之前已设置),它会返回 true超时),如果未在您的超时值内设置,则为 false

这种区别有时很重要,因此请注意返回值。

关于c# - .NET 手动重置事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11013212/

相关文章:

c# - 不能在简单的控制台应用程序中使用 Console.Readline()?

c# - 从查找中获取键

c# - MSDN 安全句柄示例

c# - 如何在 C# 中为测量单位创建通用转换器?

c# - 从字符串中剥离所有 HTML?

c# - 在使用 Visual Studio 进行调试时保持辅助线程运行

c# - 在 C# 2.0 中使用委托(delegate)结果作为输入

c# - 我可以控制 DataGridView 何时从其 DataSource 读取和写入数据吗?

java - 条件变量和锁的使用

c++ - 我无法按顺序排列三个线程