【问题标题】:Wait for a method to return true等待方法返回 true
【发布时间】:2013-12-23 12:39:13
【问题描述】:

我有两个方法 A 和 B。A 从内部调用 B 方法。无论文件是否有内容,B 方法都会返回 true 或 false。代码如下:

    public static void A()
    {
        var isValid = B();
        // Wait until "isValid" comes true
        var xx = "test";
    }

    public static bool B()
    {
        // This will check for a file content
        // Say C://test.txt
        // If the file has some content this method will return true else false
    }

我希望 A 方法等待并且不执行 "var xx = "test";"行,除非 B 方法返回 true。你能通过给出一些指示来帮助我如何做到这一点吗?

编辑:我不能简单地使用 if 循环,即 if(isValid) 因为要检查其内容的文件是由其他线程编写的,所以我需要从 A 内部不断检查 B 方法。我可以' t 让这段代码 "var xx = "test";"要执行,除非 B 返回 true,如果它返回 false,则代码应在此处等待(在 var isValid = B();),除非 B 返回 true,即代码应不断检查 B 状态。

【问题讨论】:

  • 如果您在同一个线程上执行这两种方法,它将等到 B() 完成。你在使用多线程吗?
  • 作为不相关的评论,您的B 方法是否确认所有数据都在文件中,而不仅仅是一些数据?根据文件的生成方式,您可能需要确保在文件仍在写入时不会将其注册为具有内容。

标签: c# asp.net .net c#-4.0


【解决方案1】:

你应该使用while循环

while (!B ()) { }
var x = "test";

这将执行 B 直到它返回 true。更好的方法可能是实现一个在条件变为真时触发的事件。

考虑到您正在使用文件,您可以查看 FileSystemWatcher,它可以在文件更改时触发一个方法。

【讨论】:

  • 特别是 +1 建议将事件作为更好的选择。此外,如果您需要评论来指出空语句,您最好使用{}
【解决方案2】:

使用FileSystemWatcher 对象和Changed 事件处理程序,该处理程序指向将在文件内容更改时执行的方法(并且在更改后具有内容)。

参见示例here

【讨论】:

    【解决方案3】:

    试试这个:

    if(B())
        var xx = "test";
    

    【讨论】:

      【解决方案4】:

      试试这个

      public static void A()
          {
             while(!B())
              {
             var isValid = B(); //whatever the code 
              }
           var xx = "test";
          }
      

      【讨论】:

      • 为什么在循环中调用B()
      • 调用被执行
      • @MoatazAmer:关键是您在 while 循环的每次迭代中都调用 B,因为它是循环条件,因此您无需在循环中再次调用它,除非您在 isValid 上循环而不是直接在B() 上。这对某些人来说可能具有更好的可读性,但目前您正在循环体中进行毫无意义的方法调用。
      • 嗯,他似乎想使用 B() 的返回值……在它变为真之后! ,所以他可能需要在检查它成为真的后再次调用它
      猜你喜欢
      • 2017-11-15
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2018-12-12
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多