InitializeContext (url, context, fragment, fragType);
}
- Uri ResolveUri (string url)
- {
- return resolver == null ? null : resolver.ResolveUri (null, url);
- }
-
Stream GetStreamFromUrl (string url, out string absoluteUriString)
{
#if NET_2_1
if (url.Length == 0)
throw new ArgumentException ("url");
#endif
- Uri uri = ResolveUri (url);
+ //
+ // This needs to work even if resolver is explicitly set to null
+ //
+ var res = resolver ?? new XmlUrlResolver ();
+ var uri = res.ResolveUri (null, url);
absoluteUriString = uri != null ? uri.ToString () : String.Empty;
- return resolver == null ? null : resolver.GetEntity (uri, null, typeof (Stream)) as Stream;
+ return res.GetEntity (uri, null, typeof (Stream)) as Stream;
}
#endregion
#region Cancel and Wait related method
- internal void CancelReal ()
+ internal void CancelReal (bool notifyParent = false)
{
Status = TaskStatus.Canceled;
wait_handle.Set ();
ProcessCompleteDelegates ();
+
+ if (notifyParent && parent != null && NotifyParentOnFinish ())
+ parent = null;
}
void HandleGenericException (Exception e)
public void ContinueWithChildren ()
{
ParallelTestHelper.Repeat (delegate {
- bool result = false;
+ bool result = false;
- var t = Task.Factory.StartNew (() => Task.Factory.StartNew (() => {}, TaskCreationOptions.AttachedToParent));
+ var t = Task.Factory.StartNew (() => Task.Factory.StartNew (() => {}, TaskCreationOptions.AttachedToParent));
var mre = new ManualResetEvent (false);
- t.ContinueWith (l => {
+ t.ContinueWith (l => {
result = true;
mre.Set ();
});
Assert.IsTrue (mre.WaitOne (1000), "#1");
- Assert.IsTrue (result, "#2");
+ Assert.IsTrue (result, "#2");
}, 2);
}
var t = new Task (() => {
new Task (() => { r1 = true; }, TaskCreationOptions.AttachedToParent).RunSynchronously ();
Task.Factory.StartNew (() => { Thread.Sleep (100); r2 = true; }, TaskCreationOptions.AttachedToParent);
- });
+ });
t.RunSynchronously ();
Assert.IsTrue (r1);
}
}
+ [Test]
+ public void ChildTaskWithUnscheduledContinuationAttachedToParent ()
+ {
+ Task inner = null;
+ var child = Task.Factory.StartNew (() => {
+ inner = Task.Run (() => {
+ throw new ApplicationException ();
+ }).ContinueWith (task => { }, TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.ExecuteSynchronously);
+ });
+
+ int counter = 0;
+ var t = child.ContinueWith (t2 => ++counter, TaskContinuationOptions.ExecuteSynchronously);
+ Assert.IsTrue (t.Wait (5000), "#1");
+ Assert.AreEqual (1, counter, "#2");
+ Assert.AreEqual (TaskStatus.RanToCompletion, child.Status, "#3");
+ Assert.AreEqual (TaskStatus.Canceled, inner.Status, "#4");
+ }
+
[Test]
[Category("NotWorking")]
public void TaskContinuationChainLeak()