如何在C#中使用异步方法将列表返回给调用方法

时间:2018-03-23 06:23:01

标签: c#

任何人都可以提供帮助,如何在异步函数中将列表返回给调用方法。

这是我的代码,我想返回名为ResultList

的列表
public class ResultData
{
    public int Status { get; set; }
    public string Description { get; set; }
    public int BatchId { get; set; }
}

private static List<Data> ResultList = new List<Data>();

public void TSReCalculation(int piGroupId, int piIssuerId, DateTime pdFromDate, DateTime ldToDate, int piFormulaId, int piIsProcessedType, int piIsSeriesReStart, int piIsPLCalculate, int piIsIncludeEditedScoreint)
{
     Common.callSpForTS(piGroupId, piIssuerId, pdFromDate, ldToDate, piFormulaId, piIsProcessedType, piIsSeriesReStart, piIsPLCalculate, piIsIncludeEditedScoreint);
}

public static async void callSpForTS(int piGroupId, int piIssuerId, DateTime pdFromDate, DateTime ldToDate, int piFormulaId, int piIsProcessedType, int piIsSeriesReStart, int piIsPLCalculate, int piIsIncludeEditedScoreint)
{
            await Task.Run(() =>
            {
                    try
                    {
                        sqlCommand.ExecuteNonQuery();
                        dbModel.ResultData item = new dbModel.ResultData();
                        item.Description= "succesfulll"
                        item.Status = 1;
                        item.BatchId = 100;
                        ResultList.Add(item);
                    }
                    catch (Exception ex)
                    {
                        Common.showMessageBox(ex.Message + "InnerException:" + ex.InnerException, MSG_TYP.Error, "Error Occured");
                    }
            });
        }
}

2 个答案:

答案 0 :(得分:3)

而不是public static async void callSpForTS,而不是void返回类型,您应该保留返回类型public static async List<type> callSpForTS,在代码中不需要常见的static list

始终异步

异步代码让我想起了一个人的故事,他提到世界被暂停在太空中,并立即被一位老太太挑战,声称世界停留在一只巨龟的背上。当那个男人询问乌龟站在什么地方时,那位女士回答说:“你是一个非常聪明的年轻人,但它一直是乌龟!”当你将同步代码转换为异步代码时,你会发现它有效最好的,如果异步代码调用并被其他异步代码调用 - 一直向下(或“向上”,如果你愿意)。其他人也注意到异步编程的传播行为,并将其称为“具有传染性”或将其与僵尸病毒进行比较。无论是海龟还是僵尸,异步代码往往会驱使周围的代码也是异步的。这种行为是所有类型的异步编程所固有的,而不仅仅是新的async / await关键字。

“始终异步”意味着您不应在不仔细考虑后果的情况下混合使用同步和异步代码。特别是,通过调用Task.Wait或Task.Result来阻止异步代码通常是个坏主意。对于那些将脚趾“踩踏”到异步编程中的程序员来说,这是一个特别常见的问题,它只转换应用程序的一小部分并将其包装在同步API中,因此应用程序的其余部分与更改隔离开来。不幸的是,它们遇到了死锁问题。在MSDN论坛,Stack Overflow和电子邮件上回答了许多与异步相关的问题后,我可以说这是迄今为止异步新手最常见的问题,一旦他们学会了基础知识:“为什么我的部分异步代码死锁?”

请参阅:Async/Await - Best Practices in Asynchronous Programming

除此之外,您还需要async/await来调用函数

public async void TSReCalculation(int piGroupId, int piIssuerId, DateTime pdFromDate, DateTime ldToDate, int piFormulaId, int piIsProcessedType, int piIsSeriesReStart, int piIsPLCalculate, int piIsIncludeEditedScoreint)
{
    var returnvalue =await Common.callSpForTS(piGroupId, piIssuerId, pdFromDate, ldToDate, piFormulaId, piIsProcessedType, piIsSeriesReStart, piIsPLCalculate, piIsIncludeEditedScoreint);
}

public static async Task<List<ResultData>> callSpForTS(int piGroupId, int piIssuerId, DateTime pdFromDate, DateTime ldToDate, int piFormulaId, int piIsProcessedType, int piIsSeriesReStart, int piIsPLCalculate, int piIsIncludeEditedScoreint)
{
         return await Task.Run(() =>
            {
                List<ResultData> ResultList = new List<ResultData>();
                    try
                    {
                        sqlCommand.ExecuteNonQuery();
                        dbModel.ResultData item = new dbModel.ResultData();
                        item.Description= "succesfulll"
                        item.Status = 1;
                        item.BatchId = 100;
                        ResultList.Add(item);
                    }
                    catch (Exception ex)
                    {
                        Common.showMessageBox(ex.Message + "InnerException:" + ex.InnerException, MSG_TYP.Error, "Error Occured");
                    }
                 return ResultList;
            });
        }
}

答案 1 :(得分:-1)

        public async void TSReCalculation(int piGroupId, int piIssuerId, DateTime pdFromDate, DateTime ldToDate, int piFormulaId, int piIsProcessedType, int piIsSeriesReStart, int piIsPLCalculate, int piIsIncludeEditedScoreint)
        {
            var result = await Common.callSpForTS(piGroupId, piIssuerId, pdFromDate, ldToDate, piFormulaId, piIsProcessedType, piIsSeriesReStart, piIsPLCalculate, piIsIncludeEditedScoreint);
        }


        public static async Task<List<ResultData>> callSpForTS(int piGroupId, int piIssuerId, DateTime pdFromDate, DateTime ldToDate, int piFormulaId, int piIsProcessedType, int piIsSeriesReStart, int piIsPLCalculate, int piIsIncludeEditedScoreint)
        {
            try
            {
                List<ResultData> myList = new List<ResultData>();
                sqlCommand.ExecuteNonQuery();
                dbModel.ResultData item = new dbModel.ResultData();
                item.Description = "succesfulll";
                item.Status = 1;
                item.BatchId = 100;
                myList.Add(item);
                return await Task.FromResult(myList);
            }
            catch (Exception ex)
            {
                Common.showMessageBox(ex.Message + "InnerException:" + ex.InnerException, MSG_TYP.Error, "Error Occured");
            }
        }