检查是否有任何功能成功,但全部执行

时间:2019-06-24 15:49:12

标签: c#

实现以下伪代码的一种优雅方法(易于扩展,因为可能会有更多功能,而不仅仅是A和B)?

1. Execute A()
2. Execute B()
3. If A or B succeeded, then do C()

简单的代码

if (A() || B())
    C();

不起作用,因为在这种情况下,如果A()成功,则不会执行B()

3 个答案:

答案 0 :(得分:4)

只需使用logical or operator

(使用一个|代替||

using System;

public class Program
{
    public static bool A(){
        Console.WriteLine("A");
        return true;
    }
    public static bool B(){
        Console.WriteLine("B");
        return true;
    }
    public static void Main()
    {
        if(A() | B())
        Console.WriteLine("Hello World");
    }
}

// Output:
// A
// B
// Hello World

您可以使用.NET Fiddle来运行。

答案 1 :(得分:2)

使用非短路的“或”-|MSDN:Operator or)。

  

即使第一个操作数的值为true,运算符也会计算两个操作数,因此无论第二个操作数的值如何,结果都必须为true。

使用此|运算符时,完全确实完成了问题中要求的内容,但编写需要维护的代码可能不是一个好主意。 |通常用作“按位或”,并且大多数人不知道在C#中是否也将布尔值定义为“非短路或”。如果您决定使用它,则代码应考虑添加注释,最好是添加可验证所需行为的单元测试。

对于常规代码,我将首先捕获所有方法的结果,然后查看是否存在任何真值。

var results = new[] { M1(), M2(), M3(), M4() };
if (results.Any())
{ … }

答案 2 :(得分:-1)

假设我们具有以下三个功能:

public static void A() => Console.WriteLine("A");

public static void B() => Console.WriteLine("B");

public static void C() => Console.WriteLine("C");

您可以使用以下方法:

var task = Task.Run(A)
                .ContinueWith(t => B(), TaskContinuationOptions.NotOnFaulted)
                .ContinueWith(t => C(), TaskContinuationOptions.NotOnFaulted);

task.Wait();

将执行A(),如果成功执行,则将执行B(),如果成功,则将执行C()。如果在执行A()B()时发生任何异常,则不会执行子任务。

感谢@AlexeiLevenkov,如果这些方法正在做一些CPU密集型工作,那么将它们并行化将为您带来显着的性能优势,否则并行化可能会对您的工作产生负面影响!

Microsoft说:

  

并行化任何代码(包括循环)时,一个重要的目标是   尽可能多地利用处理器,而不会过度并行化   到并行处理的开销抵消了任何   性能优势

在此处了解更多信息:https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-write-a-simple-parallel-for-loop#matrix-and-stopwatch-example