TaskCreationOptions creationOptions,
TaskScheduler scheduler)
{
- Task<TResult> t = new Task<TResult> (function, state, cancellationToken, creationOptions);
- t.Start (scheduler);
+ var t = new Task<TResult> (function, state, cancellationToken, creationOptions);
+ //
+ // Don't start cancelled task it would throw an exception
+ //
+ if (!t.IsCompleted)
+ t.Start (scheduler);
+
return t;
}
#endregion
[Test]
public void StartNewCancelled ()
{
- var cts = new CancellationTokenSource ();
- cts.Cancel ();
+ var ct = new CancellationToken (true);
- var task = factory.StartNew (() => Assert.Fail ("Should never be called"), cts.Token);
+ var task = factory.StartNew (() => Assert.Fail ("Should never be called"), ct);
try {
task.Start ();
+ Assert.Fail ("#1");
} catch (InvalidOperationException) {
}
Assert.IsTrue (task.IsCanceled, "#2");
+
+ task = factory.StartNew (() => { }, ct);
+ try {
+ task.Wait ();
+ } catch (AggregateException e) {
+ Assert.IsTrue (task.IsCanceled, "#3");
+ Assert.That (e.InnerException, Is.TypeOf (typeof (TaskCanceledException)), "#4");
+ }
}
}
}
using System.Threading.Tasks;
using NUnit.Framework;
+#if !MOBILE
+using NUnit.Framework.SyntaxHelpers;
+#endif
namespace MonoTests.System.Threading.Tasks
{
Assert.AreEqual ("1", task.Result, "#2");
}
+ [Test]
+ public void StartNewCancelled ()
+ {
+ var ct = new CancellationToken (true);
+ var factory = new TaskFactory<int> ();
+
+ var task = factory.StartNew (() => { Assert.Fail ("Should never be called"); return 1; }, ct);
+ try {
+ task.Start ();
+ Assert.Fail ("#1");
+ } catch (InvalidOperationException) {
+ }
+
+ Assert.IsTrue (task.IsCanceled, "#2");
+
+ task = factory.StartNew (() => 1, ct);
+ try {
+ task.Wait ();
+ } catch (AggregateException e) {
+ Assert.IsTrue (task.IsCanceled, "#3");
+ Assert.That (e.InnerException, Is.TypeOf (typeof (TaskCanceledException)), "#4");
+ }
+ }
}
}