提交 33d78684 编写于 作者: T Tomas Matousek

Merge pull request #653 from tmat/master

Use ReportFatalError in TaskFactory helpers
......@@ -303,12 +303,7 @@ public static T WaitAndGetResult<T>(this Task<T> task, CancellationToken cancell
// the behavior we want.
// This is the only place in the code where we're allowed to call ContinueWith.
var nextTask = task.ContinueWith(continuationFunction, cancellationToken, continuationOptions | TaskContinuationOptions.LazyCancellation, scheduler).Unwrap();
nextTask.ContinueWith(ReportFatalError, continuationFunction,
CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
ReportFatalError(nextTask, continuationFunction);
return nextTask;
}
......@@ -340,8 +335,16 @@ public static T WaitAndGetResult<T>(this Task<T> task, CancellationToken cancell
cancellationToken, taskContinuationOptions, scheduler).Unwrap();
}
internal static void ReportFatalError(Task task, object continuationFunction)
{
task.ContinueWith(ReportFatalErrorWorker, continuationFunction,
CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
}
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
private static void ReportFatalError(Task task, object continuationFunction)
private static void ReportFatalErrorWorker(Task task, object continuationFunction)
{
var exception = task.Exception;
var methodInfo = ((Delegate)continuationFunction).GetMethodInfo();
......
......@@ -81,13 +81,7 @@ public static Task SafeStartNewFromAsync(this TaskFactory factory, Func<Task> ac
{
// The one and only place we can call StartNew<>().
var task = factory.StartNew(actionAsync, cancellationToken, creationOptions, scheduler).Unwrap();
// make it crash if exception has thrown
task.ContinueWith(t => FatalError.Report(t.Exception),
CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
TaskExtensions.ReportFatalError(task, actionAsync);
return task;
}
......@@ -105,13 +99,7 @@ public static Task<TResult> SafeStartNewFromAsync<TResult>(this TaskFactory fact
{
// The one and only place we can call StartNew<>().
var task = factory.StartNew(funcAsync, cancellationToken, creationOptions, scheduler).Unwrap();
// make it crash if exception has thrown
task.ContinueWith(t => FatalError.Report(t.Exception),
CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
TaskExtensions.ReportFatalError(task, funcAsync);
return task;
}
}
......
......@@ -7,6 +7,7 @@
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.LanguageServices;
......@@ -134,19 +135,26 @@ private static string GetSyntaxTreeFilePath(DocumentInfo info)
ValueSource<TextAndVersion> newTextSource,
CancellationToken cancellationToken)
{
using (Logger.LogBlock(FunctionId.Workspace_Document_State_IncrementallyParseSyntaxTree, cancellationToken))
try
{
var newTextAndVersion = await newTextSource.GetValueAsync(cancellationToken).ConfigureAwait(false);
var newText = newTextAndVersion.Text;
using (Logger.LogBlock(FunctionId.Workspace_Document_State_IncrementallyParseSyntaxTree, cancellationToken))
{
var newTextAndVersion = await newTextSource.GetValueAsync(cancellationToken).ConfigureAwait(false);
var newText = newTextAndVersion.Text;
var oldTreeAndVersion = await oldTreeSource.GetValueAsync(cancellationToken).ConfigureAwait(false);
var oldTree = oldTreeAndVersion.Tree;
var oldText = await oldTree.GetTextAsync(cancellationToken).ConfigureAwait(false);
var oldTreeAndVersion = await oldTreeSource.GetValueAsync(cancellationToken).ConfigureAwait(false);
var oldTree = oldTreeAndVersion.Tree;
var oldText = await oldTree.GetTextAsync(cancellationToken).ConfigureAwait(false);
var newTree = oldTree.WithChangedText(newText);
Contract.ThrowIfNull(newTree);
var newTree = oldTree.WithChangedText(newText);
Contract.ThrowIfNull(newTree);
return MakeNewTreeAndVersion(oldTree, oldText, oldTreeAndVersion.Version, newTree, newText, newTextAndVersion.Version);
return MakeNewTreeAndVersion(oldTree, oldText, oldTreeAndVersion.Version, newTree, newText, newTextAndVersion.Version);
}
}
catch (Exception e) when (FatalError.ReportUnlessCanceled(e))
{
throw ExceptionUtilities.Unreachable;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册