任何人都可以提供帮助,如何在异步函数中将列表返回给调用方法。
这是我的代码,我想返回名为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");
}
});
}
}
答案 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");
}
}