如何在 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");
}
});
}
}

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


一路异步

异步代码让我想起了一个人的故事,他提到世界悬浮在太空中,并立即受到一位老太太的挑战,声称世界位于一只巨龟的背上。当男人问站在什么地方时,那位女士回答说:"你很聪明,年轻人,但一直都是!将同步代码转换为异步代码时,您会发现异步代码调用时效果最佳,并且由其他异步代码调用 - 一直向下(或"向上",如果您愿意)。其他人也注意到异步编程的传播行为,并称其为"传染性"或将其与僵尸病毒进行比较。无论是还是僵尸,异步代码都倾向于驱动周围的代码也是异步的,这绝对是真的。此行为是所有类型的异步编程所固有的,而不仅仅是新的 async/await 关键字。

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

请参考这个: 异步/等待 - 异步编程的最佳实践

除此之外,您还需要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;
});
}
}
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");
}
}

最新更新