【问题标题】:"Synchronous" functions in C#?C# 中的“同步”函数?
【发布时间】:2011-11-08 13:33:07
【问题描述】:

我正在创建一个自定义状态机,为了成为决定论者,我必须“同步”我的转换。我不确定“同步”这个词,但我想要的是当我调用一个函数(通过 EventHandler)时,系统就像在我可以调用另一个函数(也通过 EventHandler)之前冻结。

用英语准确地解释它有点困难,但我想你知道我的意思......

我在考虑线程,但我真的很想避免这种情况......

【问题讨论】:

  • 请发布您的代码,以便我们看到您在说什么。
  • 如果您不使用多线程,它已经以您想要的方式工作。直到事件处理程序的执行没有完成,其他功能不能丰富。
  • 事实上,我从一个状态到另一个状态的转换是由“事件”(如 java 中的侦听器)触发的,我不知道 C# 是如何工作的。我的意思是,当 C# 意识到前一个事件的每个函数调用都结束时,是否有一种事件堆栈和事件被 1 个触发?还是 C# 在多个线程中触发侦听器?
  • @GuillaumeCogranne:C# 中的事件按顺序进行。因此,如果您不在任何多线程代码内部调用,它们将阻止您的程序执行,直到其执行结束。
  • 我在“ActionListener”中尝试了一个 Thread.sleep 并注意到你在说什么!谢谢你的信息

标签: c# multithreading synchronization


【解决方案1】:

如果您想模拟 java 中“同步”关键字的效果,最好的方法可能是将整个方法代码包装在里面

lock(this)
{
    // code
}

【讨论】:

  • 不推荐lock(this),顺便说一句
  • 我知道,但这将是最好的等效于 java“同步”方法。
  • 但唯一提到 java 的人是你自己......同步远远超出了特定语言中的关键字
  • 看帖子标题,还有这个:“系统在我调用另一个函数之前就冻结了”。在我看来,这强烈表明他希望进行互斥的方法调用。无论如何,我们可能应该等待 OP 的澄清。
  • @Tudor:IMO,相当于Java的synchronized就是用[MethodImpl(MethodImplOptions.Synchronized)]装饰方法(这又相当于把整个方法体放在一个lock (this) { ... }块内。跨度>
【解决方案2】:

不确定这是否是您要查找的内容,但 C# 迭代器块本质上是 state machines

【讨论】:

  • 我找到了有关它的信息,但他不适合我想做的事情:/
【解决方案3】:

同步是指您处于多线程环境中,并且您需要通过同步的线程(一次 1 个)访问资源。这确保了当线程正在更改资源而其他线程试图访问它们时,不会产生不可预测的结果。 C# 中有许多可供您使用的构造来处理同步。这完全取决于您的线程想要完成的任务。

这是来自 MSDN 的链接,其中显示了一些简单的示例:http://msdn.microsoft.com/en-us/library/ms173179.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多