【发布时间】:2018-08-01 14:17:25
【问题描述】:
我遇到了关于执行以下方法的问题。主要目的是这两个任务应该顺序执行。但是当我执行这个方法时,我得到 System.AggregateException。
public Task<StockOptionData> GetOptionDataAsync(Stream str, Stock stck)
{
Task<StockOptionData> res; //second task /result task
Task<string> text; // first task
using (StreamReader reader = new StreamReader(str))
{
// Part 1
text = reader.ReadToEndAsync();
}
// Part 2
res = text.ContinueWith((i) =>
{
JavaScriptSerializer ser = new JavaScriptSerializer();
FullStockInfo info = ser.Deserialize<FullStockInfo>(i.Result);
StockOptionData datas = new StockOptionData(info);
return datas;
});
return res;
}
有错误:
System.Reflection.TargetInvocationException:调用的目标已抛出异常。 ---> System.AggregateException:发生一个或多个错误。 ---> System.ObjectDisposedException:无法访问已处置的对象。 对象名称:'SslStream'。 在 System.Net.ConnectStream.EndRead(IAsyncResult asyncResult) 在 System.IO.Stream.c.b__43_1(流流,IAsyncResult asyncResult) 在 System.Threading.Tasks.TaskFactory
1.FromAsyncTrimPromise1.Complete(TInstance thisRef, Func`3 endMethod, IAsyncResult asyncResult, Boolean requiresSynchronization) --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) ...
仅当我使用此方法的异步版本时才发生异常。单胎面执行正常。问题是,我的错误在哪里?顺序执行具有不同结果的多个任务的最佳方法是什么?
【问题讨论】:
-
读取数据时为什么没有在阅读器上调用
await? -
为什么你使用
ContinueWith()而不是仅仅使用await?你的代码是不必要的复杂,没有任何好处。 -
看起来您将 ObjectDisposedException 作为内部异常,这意味着您在任务开始之前处置了阅读器。任务不保证立即启动。
标签: c# multithreading