TaskContinuationOptions combinations

huangapple go评论90阅读模式
英文:

TaskContinuationOptions combinations

问题

当我查看异步模式PipeTo for Akka.NET时,我发现作者在示例中使用了TaskContinuationOptions和运算符&。这是一个错误还是使用&与Akka.NET和PipeTo的正确方式?

更好地解释一下:
AttachedToParent & ExecuteSynchronously返回0,内部Lambda将被异步调用。

TaskContinuationOptions.cs
>/// <summary>如果未指定任何继续选项,则指定在执行继续时应使用默认行为。无论前置任务何时完成,继续都会异步运行,而不考虑前置任务的最终<see cref="P:System.Threading.Tasks.Task.Status" />属性值。如果继续是子任务,则将其创建为独立的嵌套任务。</summary>

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

问题应该使用"&"还是"|"运算符?

英文:

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
>/// <summary>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 <see cref="P:System.Threading.Tasks.Task.Status" /> property value. It the continuation is a child task, it is created as a detached nested task.</summary>

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

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

答案1

得分: 4

TL;DR:

是的。作者应该使用|而不是&amp;

LONG ANSWER:

按位与 => 仅当比较的两位都为1时,结果位才为1。
按位或 => 仅当两个比较的位中任何一个为1时,结果位才为1。

因此,您首先想要将数字转换为二进制(我会添加一些0以使比较更容易):

  • 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

现在您知道,例如,OnlyOnCanceled 等同于 NotOnFaulted+ NotOnRanToCompletion
或者,使用按位运算符:NotOnFaulted | NotOnRanToCompletion

另一方面,NotOnFaulted &amp; NotOnRanToCompletion 等于 0,对应于 None
OnlyOnCanceled &amp; NotOnFaulted == NotOnRanToCompletion

所以答案是:当您想要组合时,使用 |。当您想要获取差异时,使用 &amp;

希望这个示例使问题更清晰。

英文:

TL;DR:

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

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 &amp; NotOnRanToCompletion is equal to 0, that corresponds to None.
While OnlyOnCanceled &amp; NotOnFaulted == NotOnRanToCompletion.

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

I hope this example made it clearer.

huangapple
  • 本文由 发表于 2020年1月3日 21:10:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/59579200.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定