Quellcode durchsuchen

Revert fcbb5717c18ff8393f2300a254bb13e6fab9c7e4 and implement it differently.

The commit had the good idea but since some values of the enumeration overlap it broke the correct behavior. Instead we now turn off the extra options and use the previous way to check.
Jérémie Laval vor 15 Jahren
Ursprung
Commit
48e433753d

+ 15 - 9
mcs/class/corlib/System.Threading.Tasks/Task.cs

@@ -302,26 +302,32 @@ namespace System.Threading.Tasks
 			int kindCode = (int)kind;
 			
 			if (kindCode >= ((int)TaskContinuationOptions.NotOnRanToCompletion)) {
+				// Remove other options
+				kind &= ~(TaskContinuationOptions.PreferFairness
+				          | TaskContinuationOptions.LongRunning
+				          | TaskContinuationOptions.AttachedToParent
+				          | TaskContinuationOptions.ExecuteSynchronously);
+
 				if (status == TaskStatus.Canceled) {
-					if ((kind & TaskContinuationOptions.NotOnCanceled) > 0)
+					if (kind == TaskContinuationOptions.NotOnCanceled)
 						return false;
-					if ((kind & TaskContinuationOptions.OnlyOnFaulted) > 0)
+					if (kind == TaskContinuationOptions.OnlyOnFaulted)
 						return false;
-					if ((kind & TaskContinuationOptions.OnlyOnRanToCompletion) > 0)
+					if (kind == TaskContinuationOptions.OnlyOnRanToCompletion)
 						return false;
 				} else if (status == TaskStatus.Faulted) {
-					if ((kind & TaskContinuationOptions.NotOnFaulted) > 0)
+					if (kind == TaskContinuationOptions.NotOnFaulted)
 						return false;
-					if ((kind & TaskContinuationOptions.OnlyOnCanceled) > 0)
+					if (kind == TaskContinuationOptions.OnlyOnCanceled)
 						return false;
-					if ((kind & TaskContinuationOptions.OnlyOnRanToCompletion) > 0)
+					if (kind == TaskContinuationOptions.OnlyOnRanToCompletion)
 						return false;
 				} else if (status == TaskStatus.RanToCompletion) {
-					if ((kind & TaskContinuationOptions.NotOnRanToCompletion) > 0)
+					if (kind == TaskContinuationOptions.NotOnRanToCompletion)
 						return false;
-					if ((kind & TaskContinuationOptions.OnlyOnFaulted) > 0)
+					if (kind == TaskContinuationOptions.OnlyOnFaulted)
 						return false;
-					if ((kind & TaskContinuationOptions.OnlyOnCanceled) > 0)
+					if (kind == TaskContinuationOptions.OnlyOnCanceled)
 						return false;
 				}
 			}

+ 2 - 1
mcs/class/corlib/Test/System.Threading.Tasks/TaskTest.cs

@@ -162,7 +162,8 @@ namespace MonoTests.System.Threading.Tasks
 				Task t = new Task(delegate { taskResult = true; }, src.Token);
 				src.Cancel ();
 				
-				Task cont = t.ContinueWith (delegate { result = true; }, TaskContinuationOptions.OnlyOnCanceled);
+				Task cont = t.ContinueWith (delegate { result = true; },
+				                            TaskContinuationOptions.OnlyOnCanceled | TaskContinuationOptions.ExecuteSynchronously);
 
 				t.Start();
 				cont.Wait();