我遇到了有关执行以下方法的问题。主要目的是应按顺序执行这两个任务。但是当我执行此方法时,我得到了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.FromAsyncTrimPromise
1.Complete(TInstance thisRef,Func`3 endMethod,IAsyncResult asyncResult,布尔值requireSynchronization) ---从之前引发异常的位置开始的堆栈结束跟踪--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) ...
仅当我使用此方法的异步版本时,才会发生异常。单胎面执行可以正常工作。问题是,我的错误在哪里?依次执行结果不同的多个任务的最佳方法是什么?
答案 0 :(得分:3)
更简单明了。
您使用await
和Task
等待读取操作完成。完成后,代码将继续运行Deserialize
public async Task<StockOptionData> GetOptionDataAsync(Stream str, Stock stck)
{
string myTextString = "";
using (StreamReader reader = new StreamReader(str))
{
myTextString = await reader.ReadToEndAsync();
}
JavaScriptSerializer ser = new JavaScriptSerializer();
FullStockInfo info = ser.Deserialize<FullStockInfo>(myTextString);
StockOptionData datas = new StockOptionData(info);
return datas;
}
这是example,说明如何顺序执行任务列表
答案 1 :(得分:0)
简短的答案是此方法不是异步的。尝试将async
关键字添加到方法中,并添加await
任何异步操作。
有关实现方法,请参见Thierry V的回答...