C#中与Java的wait和notify相对应的功能是什么?

29 浏览
0 Comments

C#中与Java的wait和notify相对应的功能是什么?

我知道在C#中可以使用lock关键字锁定一个对象,但是你能放弃锁并等待其他东西通知你它已经改变,就像在Java中使用wait和notify一样吗?

在我看来,Java中的synchronized和C#中的lock是相似的。

0
0 Comments

C#中与Java的wait和notify等价的功能(包括正常的锁定)在Monitor类中实现。

foo.notify()等价于Monitor.Pulse(foo)

foo.notifyAll()等价于Monitor.PulseAll(foo)

foo.wait()等价于Monitor.Wait(foo)

在C#中,lock语句等价于使用try/finally块调用Monitor.Enter和Monitor.Exit。

要了解更多细节,请参考我的线程教程或Joe Albahari的线程教程。

从Java API中可以得知,wait()方法会导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。

有人称在调用Monitor.Wait()方法之前需要等待,只有当另一个线程争用锁时才会等待。

其中一位成员对此提问,但是很快就发现是自己误解了MSDN的文章。

为了更方便地将代码从Java移植到C#,我将这些功能封装成了扩展方法。

然而,来自.NET背景的人阅读你的代码时可能会觉得不够符合C#的习惯用法,这取决于你的团队。

我的团队只有我一个人,作为创业公司的创始人,我正在使用Java编写Web应用程序。C#代码是一个作为Windows服务运行的API客户端,我认为使用C#是最好的选择。如果有开发人员加入,他们可以根据自己的意愿将代码改写为更符合C#习惯用法的形式。

0
0 Comments

C# 中的 Wait 和 Notify 的等效方法是什么?

在 C# 中,我们需要找到一个与 Java 中的 wait 和 notify 方法相对应的方法。在 Java 中,wait 方法用于使线程进入等待状态,直到其他线程调用 notify 方法来唤醒它。然而,在 C# 中并没有直接的 wait 和 notify 方法。那么,我们应该如何解决这个问题呢?

解决方法:

一个可能的解决方法是使用 C# 中的 Wait Handles。Wait Handles 是一种同步原语,它可以在多个线程之间进行通信和同步。使用 Wait Handles,我们可以实现与 Java 中的 wait 和 notify 方法类似的功能。

下面是一个使用 Wait Handles 来实现线程等待和唤醒的示例代码:

using System;
using System.Threading;
class Program
{
    static EventWaitHandle _waitHandle = new AutoResetEvent(false);
    static void Main()
    {
        Thread t1 = new Thread(DoWork);
        Thread t2 = new Thread(DoWork);
        t1.Start();
        t2.Start();
        // 等待两个线程完成工作
        WaitHandle.WaitAll(new[] { _waitHandle, _waitHandle });
        Console.WriteLine("All threads completed their work.");
    }
    static void DoWork()
    {
        Console.WriteLine("Thread started working.");
        // 假装工作了一段时间
        Thread.Sleep(2000);
        Console.WriteLine("Thread completed work.");
        // 通知其他线程工作已完成
        _waitHandle.Set();
    }
}

在上面的示例中,我们创建了两个线程 t1 和 t2,并让它们执行工作。在每个线程完成工作后,它们会调用 `_waitHandle.Set()` 方法来通知其他线程工作已经完成。在主线程中,我们使用 `WaitHandle.WaitAll` 方法来等待两个线程的工作完成。

虽然 C# 中没有直接的 wait 和 notify 方法,但我们可以使用 Wait Handles 来实现类似的功能。Wait Handles 是一种同步原语,它可以在多个线程之间进行通信和同步。使用 Wait Handles,我们可以实现线程的等待和唤醒。在上面的示例中,我们展示了如何使用 Wait Handles 来实现线程等待和唤醒的功能。

0