【发布时间】:2016-04-14 00:57:19
【问题描述】:
我对 async/await 的理解肯定存在缺陷。我想要一段名为 SaveSearchCase 的代码在后台异步运行。
我希望它被触发并忘记它并继续当前方法的返回语句。
public IList<Entities.Case.CreateCaseOutput> createCase(ARC.Donor.Data.Entities.Case.CreateCaseInput CreateCaseInput, ARC.Donor.Data.Entities.Case.SaveCaseSearchInput SaveCaseSearchInput)
{
..........
..........
..........
var AcctLst = rep.ExecuteStoredProcedure<Entities.Case.CreateCaseOutput>(strSPQuery, listParam).ToList();
if (!string.IsNullOrEmpty(AcctLst.ElementAt(0).o_case_seq.ToString()))
{
Task<IList<Entities.Case.SaveCaseSearchOutput>> task = saveCaseSearch(SaveCaseSearchInput, AcctLst.ElementAt(0).o_case_seq);
Task t = task.ContinueWith(
r => { Console.WriteLine(r.Result); }
);
}
Console.WriteLine("After the async call");
return AcctLst;
}
SaveCaseSearch 看起来像
public async Task<IList<Entities.Case.SaveCaseSearchOutput>> saveCaseSearch(ARC.Donor.Data.Entities.Case.SaveCaseSearchInput SaveCaseSearchInput,Int64? case_key)
{
Repository rep = new Repository();
string strSPQuery = string.Empty;
List<object> listParam = new List<object>();
SQL.CaseSQL.getSaveCaseSearchParameters(SaveCaseSearchInput, case_key,out strSPQuery, out listParam);
var AcctLst = await rep.ExecuteStoredProcedureAsync<Entities.Case.SaveCaseSearchOutput>(strSPQuery, listParam);
return (System.Collections.Generic.IList<ARC.Donor.Data.Entities.Case.SaveCaseSearchOutput>)AcctLst;
}
但是当我看到调试器 createCase 方法首先等待 SaveCaseSearch 完成,然后才完成
它打印 "After Async Call"
然后返回。我绝对不想要。
那么我的理解在哪方面有缺陷?请帮助使其异步运行并继续当前方法的打印和返回语句。
更新
我更新了 SaveCaseSearch 方法以反映如下:
public async Task<IList<Entities.Case.SaveCaseSearchOutput>> saveCaseSearch(ARC.Donor.Data.Entities.Case.SaveCaseSearchInput SaveCaseSearchInput,Int64? case_key)
{
return Task.Run<IList<Entities.Case.SaveCaseSearchOutput>>(async (SaveCaseSearchInput, case_key) =>
{
Repository rep = new Repository();
string strSPQuery = string.Empty;
List<object> listParam = new List<object>();
SQL.CaseSQL.getSaveCaseSearchParameters(SaveCaseSearchInput, case_key, out strSPQuery, out listParam);
var AcctLst = await rep.ExecuteStoredProcedureAsync<Entities.Case.SaveCaseSearchOutput>(strSPQuery, listParam);
return (System.Collections.Generic.IList<ARC.Donor.Data.Entities.Case.SaveCaseSearchOutput>)AcctLst;
});
}
但是参数有问题。它说
Error 4 A local variable named 'SaveCaseSearchInput' cannot be declared in this scope because it would give a different meaning to 'SaveCaseSearchInput', which is already used in a 'parent or current' scope to denote something else C:\Users\m1034699\Desktop\Stuart_V2_12042016\Stuart Web Service\ARC.Donor.Data\Case\Search.cs 43 79 ARC.Donor.Data
【问题讨论】:
-
当你使用异步功能时,你应该将回调传递给你的函数,在它完成所有你需要的事情之后,你调用回调,这就是你使用异步的方式,因为当你使用返回语句时,它将运行同步
-
if (!string.IsNullOrEmpty(AcctLst.ElementAt(0).o_case_seq.ToString())) { SaveCaseSearch ...} 我想在后台调用这个方法 async 。你能告诉我如何达到同样的效果吗?
-
你应该在调用
saveCaseSearch方法时使用await关键字,然后打印结果。 -
编译器可能会告诉你,如果你不使用 await 关键字,它会同步运行。而且该方法仍将在主线程上运行(不是真正触发并忘记),但在执行存储过程时它不会阻塞线程。
标签: c# asynchronous asp.net-web-api async-await