Search code examples
c#asynchronoustask-parallel-libraryakka.net

TaskContinuationOptions combinations


When I was looked at asynchronous pattern PipeTo for Akka.NET I found example where author uses TaskContinuationOptions and operator &. Is it an erorr or may be it is a propper way to use '&' with Akka.NET and a PipeTo?

For better explain: AttachedToParent & ExecuteSynchronously gave 0 and the inner lambda would be invoked as asyncronosly task.

TaskContinuationOptions.cs

/// When no continuation options are specified, specifies that default behavior should be used when executing a continuation. The continuation runs asynchronously when the antecedent task completes, regardless of the antecedent's final property value. It the continuation is a child task, it is created as a detached nested task.

None = 0,
AttachedToParent = 4,
ExecuteSynchronously = 524288, // 0x00080000

The question should be there "&" or "|" operator?


Solution

  • TL;DR:

    Yes. The author should have used | instead of &.

    LONG ANSWER:

    Bitwise AND => The resulting bit is 1 only if both compared bits are 1.
    Bitwise OR => The resulting bit is 1 if any of the two compared bits is 1.

    So you first want to translate the numbers to binary (I'll add some 0's to make the comparison easier):

    • 000000 : 00000000000000000000 (None)
    • 000001 : 00000000000000000001 (PreferFairness)
    • 000002 : 00000000000000000010 (LongRunning)
    • 000004 : 00000000000000000100 (AttachedToParent)
    • 065536 : 00010000000000000000 (NotOnRanToCompletion)
    • 131072 : 00100000000000000000 (NotOnFaulted)
    • 196608 : 00110000000000000000 (OnlyOnCanceled)
    • 262144 : 01000000000000000000 (NotOnCanceled)
    • 327680 : 01010000000000000000 (OnlyOnFaulted)
    • 393216 : 01100000000000000000 (OnlyOnFaulted)
    • 524288 : 10000000000000000000 (ExecuteSynchronously)

    Now you know, for example, that OnlyOnCanceled is the same as NotOnFaulted+ NotOnRanToCompletion.
    Or, using bitwise operators: NotOnFaulted | NotOnRanToCompletion.

    On the other hand NotOnFaulted & NotOnRanToCompletion is equal to 0, that corresponds to None.
    While OnlyOnCanceled & NotOnFaulted == NotOnRanToCompletion.

    So the answer is: when you want to combine, use |. When you want to get the difference, use &.

    I hope this example made it clearer.