多任务执行

时间:2018-08-01 14:17:26

标签: c# multithreading

我遇到了有关执行以下方法的问题。主要目的是应按顺序执行这两个任务。但是当我执行此方法时,我得到了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(任务任务)   ...

仅当我使用此方法的异步版本时,才会发生异常。单胎面执行可以正常工作。问题是,我的错误在哪里?依次执行结果不同的多个任务的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

更简单明了。

您使用awaitTask等待读取操作完成。完成后,代码将继续运行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的回答...