我在调试器中遇到这样的问题,程序停止执行.调试器没有显示该行,所以我不知道要修复什么.
mscorlib.dll中发生了未处理的"System.AggregateException"类型异常
附加信息:通过等待任务或访问其Exception属性未观察到任务的异常.结果,终结器线程重新抛出了未观察到的异常.
无法获得本地或参数''的值,因为它在此指令指针处不可用,可能是因为它已经被优化掉了.System.Threading.Tasks.TaskExceptionHolder
如何解决我的问题?
我还发现这个非常相似的问题无法获得本地或参数的值,因为它在此指令指针处不可用,可能是因为它已被优化掉了
我遇到了几个我打电话的问题,但里面还有flatten另一个问题!这显然意味着它们正在链中传播并被卷入另一个链中.有没有办法递归展平所有内部AggregateExceptions?通常,我将使用句柄委托处理这些,但如果有另一个内部AggregateExceeption,则返回false.我没有妥善处理这些问题吗?AggregateExceptionAggregateExceptionAggregateException
编辑:既然我已经打电话展平,看来问题是,它没有被抓住,直到后来方式在调用堆栈.这是我正在调用Flatten()的代码.要在堆栈跟踪中使用,此方法称为WriteExceptionRecord(string,FileInfo):
do
{
try
{
using (var stream = file.Open(FileMode.Append, FileAccess.Write, FileShare.None))
{
using (StreamWriter writer = new StreamWriter(stream))
{
await writer.WriteLineAsync(data);
}
}
}
catch (AggregateException ex)
{
ex.Flatten().Handle((x) =>
{
if (x is IOException)
{
retryNeeded = true;
retryLeft--;
Thread.Sleep(500);
return true;
}
logger.ErrorException("Could not write to exception file: " + data, ex);
return false;
});
}
}
while (retryNeeded && retryLeft > 0);
Run Code Online (Sandbox Code Playgroud)
但是,堆栈跟踪显示它没有被捕获.相反,它会在调用堆栈之后被捕获.以下是出于安全原因删除了一些识别信息的跟踪:
System.AggregateException: One or more errors occurred. ---> …Run Code Online (Sandbox Code Playgroud) 您好我正在使用类似这样的HttpClient:
public static Task<string> AsyncStringRequest(string url, string contentType)
{
try
{
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType));
return client.GetStringAsync(url).ContinueWith(task => {
return task.Result;
});
}
catch (AggregateException ex)
{
throw ex;
}
catch (WebException ex)
{
throw ex;
}
catch (Exception ex)
{
throw ex;
}
}
Run Code Online (Sandbox Code Playgroud)
但我处理异常时遇到困难.我添加了额外的catch块只是为了尝试并逐步抛出,但没有任何断点被捕获到任何catch块中.我意识到使用Task,异常可能发生在与调用者不同的线程上,因此异常包含在聚合容器中,但我不确定处理这些异常的最佳方法是什么.
例如,我向Web服务发出请求,并在请求中指定了特定的无效参数,并抛出异常.我希望我能够捕获聚合异常,并查看innerexceptions以找出请求失败的原因并返回友好消息.
所以我的问题是,捕获这些聚合异常并处理它们的最佳方法是什么?
我有如下代码来捕获使用TaskFactory和Task.Run创建的任务抛出异常.如果我使用TaskFactory,我可以检查继续任务中从上一个任务抛出的异常,而不必使用Task.WaitAll方法.如果我使用Task.Run,则除非我明确等待子任务完成,否则将不会执行Continued任务.TaskFactory.StartNew中的哪个标志改变了这种行为?
另外,AggregateException类中的InnerException和InnerExceptions有什么区别?InnerExceptions返回一个由子任务抛出的所有异常的只读集合.InnerException返回仅由一个子任务抛出的异常的AggregateExcpetion.
//Use Factory
TaskCreationOptions atp = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew(() =>
{
Task.Factory.StartNew (() => { throw null; }, atp);
Task.Factory.StartNew (() => { throw new NullReferenceException();}, atp);
Task.Factory.StartNew (() => { throw new Exception("Test"); }, atp);
})
.ContinueWith (p => p.Exception.Dump(),TaskContinuationOptions.OnlyOnFaulted);
//Use Task.Run
Task.Run(()=>
{
TaskCreationOptions op = TaskCreationOptions.AttachedToParent;
var t1 = Task.Factory.StartNew(()=> {throw null;}, op);
var t2 = Task.Factory.StartNew(()=> {throw new NullReferenceException();}, op);
var t3 = Task.Factory.StartNew(()=> {throw new Exception("Test");}, op);
//This will trigger the continued task
//Task.WaitAll(new Task[]{t1,t2,t3}); …Run Code Online (Sandbox Code Playgroud) 我正在使用任务并行库来运行一个任务 - 当取消时 - 抛出OperationCanceledException,然后使用AggregateException捕获它,如下所示.AggregateException包含TaskCanceledExceptions列表,它对应于抛出的异常.不幸的是,这些TaskCanceledExceptions似乎正在丢失原始异常抛出的堆栈跟踪.这是设计的吗?
try
{
task1.Wait();
}
catch (AggregateException aggEx)
{
var tcex = ex as TaskCanceledException;
if (tcex != null)
{
Debug.WriteLine("InnerException:{0}, Message:{1}, Source:{2}, StackTrace: {3}",
tcex.InnerException, tcex.Message, tcex.Source, tcex.StackTrace);
return true;
}
else
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
InnerException:, Message:A task was canceled., Source:, StackTrace:
Run Code Online (Sandbox Code Playgroud) c# .net-4.0 task-parallel-library cancellation aggregateexception
当我直接使用ToString()method 时,我得到完整的嵌套异常集AggregateException:
public void GreenTest()
{
var ex = new AggregateException(new Exception("ex1"), new Exception("ex2"));
ex.ToString()
.Should()
.Contain("ex1")
.And
.Contain("ex2");
}
Run Code Online (Sandbox Code Playgroud)
问题是当我被AggregateException另一个异常包装时,我只得到第一个异常:
public void RedTest()
{
var ex = new Exception("wrapper", new AggregateException(new Exception("ex1"), new Exception("ex2")));
ex.ToString()
.Should()
.Contain("wrapper")
.And
.Contain("ex1")
.And
.Contain("ex2");
}
Run Code Online (Sandbox Code Playgroud)
ex2在结果字符串中不存在.这是一个错误或类的一些众所周知的功能AggregateException?
ReSharper 给了我一个 CoVariantConversion 警告,所以我决定谷歌一下,看看如何解决它。我遇到了这段代码:
// ReSharper disable CoVariantArrayConversion
try
{
Task.WaitAll(taskList.ToArray());
}
catch (AggregateException ex)
{
ex.Handle(e => true);
}
// ReSharper restore CoVariantArrayConversion
Run Code Online (Sandbox Code Playgroud)
这部分让我感到困惑:
ex.Handle(e => true);
Run Code Online (Sandbox Code Playgroud)
它有什么作用?我会认为它什么都不做。
c# resharper lambda task-parallel-library aggregateexception
我正在使用PLINQ,代码如下:
static void Main(string[] args)
{
var lt = new List<int>() {1,2,3,4,5};
try
{
var nlt = lt.AsParallel().Select(Test).ToList();
}
catch (AggregateException e)
{
foreach (var ex in e.InnerExceptions)
{
Console.WriteLine(ex.Message);
}
}
}
private static bool Test(int n)
{
if (n == 1)
{
Thread.Sleep(1000);
}
if (n == 3)
{
Thread.Sleep(3000);
}
if (n == 5)
{
Thread.Sleep(5000);
}
if (n == 2 || n == 4)
{
throw new Exception("New exception");
}
Console.WriteLine("element : {0}", n);
return true; …Run Code Online (Sandbox Code Playgroud) 为什么这不完整?相反,它抛出一个异常,就像没有捕获异常一样.而且,"索引超出数组范围"的例外对我来说没有意义.
int n = 3;
string[] names = new string[] { "sally", "fred", "gina" };
Task[] myTasks = new Task[n];
for (int y = 0; y < n; y++)
{
myTasks[y] = Task.Factory.StartNew(() =>
{
Action<string> action = (name) =>
{
try
{
throw new Exception(name + ", I bet you can't catch me.");
}
catch (Exception e)
{
//I caught you... didn't I?
}
};
action(names[y]);
});
}
Task.WaitAll(myTasks);
Console.WriteLine("All tasks complete.");//This line is never reached;
Run Code Online (Sandbox Code Playgroud) 如果我的WinForms应用程序启动任务以在执行任务时保持响应,我在处理AggregateException时会遇到问题。
简化的情况如下。假设我的Form有一个相当慢的方法,例如:
private double SlowDivision(double a, double b)
{
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5));
if (b==0) throw new ArgumentException("b");
return a / b;
}
Run Code Online (Sandbox Code Playgroud)
按下按钮后,我希望我的表单显示SlowDivision(3,4)的结果。以下代码会将用户界面挂起一段时间:
private void button1_Click(object sender, EventArgs e)
{
this.label1.Text = this.SlowDivision(3, 4).ToString();
}
Run Code Online (Sandbox Code Playgroud)
因此,我想开始执行处理任务。该任务完成后,应继续执行将显示结果的操作。为了防止InvalidOperationException,我需要确保从创建标签的线程访问label1,因此需要Control.Invoke:
private void button1_Click(object sender, EventArgs e)
{
Task.Factory.StartNew ( () =>
{
return this.SlowDivision(3, 4);
})
.ContinueWith( (t) =>
{
this.Invoke( new MethodInvoker(() =>
{
this.label1.Text = t.Result.ToString();
}));
});
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好,但是如何处理异常,例如,如果我想计算SlowDivision(3,0)?
通常,如果任务抛出未处理的异常,它将通过AggregateException转发到等待线程。许多示例显示以下代码:
var myTask = Task.Factory.StartNew ( () => ...);
try
{
myTask.Wait();
}
catch …Run Code Online (Sandbox Code Playgroud) 我已按照(http://www.c-sharpcorner.com/UploadFile/a6fd36/understand-self-host-of-a-web-apiC-Sharp/)和(http://www.c- Sharpcorner.com/uploadfile/a6fd36/understanding-how-to-call-the-web-api-from-a-client-applica/)但似乎仍然出现 System.AggregateException
//Call HttpClient.GetAsync to send a GET request to the appropriate URI
HttpResponseMessage resp = client.GetAsync("api/books").Result;
Run Code Online (Sandbox Code Playgroud)
和
var resp = client.GetAsync(string.Format("api/books/{0}", id)).Result;
Run Code Online (Sandbox Code Playgroud)
和
var resp = client.GetAsync(query).Result;
Run Code Online (Sandbox Code Playgroud)
错误指出: mscorlib.dll 中发生了类型为“System.AggregateException”的未处理异常
异常详细信息 -
System.AggregateException was unhandled
HResult=-2146233088
Message=One or more errors occurred.
Source=mscorlib
StackTrace:
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at System.Threading.Tasks.Task`1.get_Result()
at TestClient.Program.ListAllBooks() in c:\Users\wa\Documents\Visual Studio 2013\Projects\SelfHost\TestClient\Program.cs:line 35
at TestClient.Program.Main(String[] args) in c:\Users\wa\Documents\Visual Studio 2013\Projects\SelfHost\TestClient\Program.cs:line 20
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, …Run Code Online (Sandbox Code Playgroud)