好的,我希望我已经掌握了async/await的基础知识,但是我脑海中仍有一些问题。
现在问题来了,假设在这个简单的例子中:
static void Main(string[] args)
{
Method();
Console.WriteLine("Main Thread");
Console.ReadLine();
}
public async static void Method()
{
await Task.Run(new Action(LongTask));
Console.WriteLine("New Thread");
}
public static void LongTask()
{
Thread.Sleep(8000);
Console.WriteLine("Long Task");
}
调用Method()函数后,主线程仍然继续执行,并在遇到8秒的await后打印Main Thread
。
因此,一旦Method()函数遇到await并保存同步上下文后,它会返回给调用者,即主函数,在那里继续执行。
它先打印Main Thread
。
然后在8秒完成后,依次打印Long Task
和New Thread
。
我已经理解了这部分内容。我的问题是在我的应用程序中:
public IList<createcaseoutput> createCase(CreateCaseInput CreateCaseInput,SaveCaseSearchInput SaveCaseSearchInput)
{
.............
SQL.CaseSQL.getCreateCaseParameters(CreateCaseInput, out strSPQuery, out listParam);
var AcctLst = rep.ExecuteStoredProcedure<createcaseoutput>(strSPQuery, listParam).ToList();
if (!string.IsNullOrEmpty(AcctLst.ElementAt(0).o_case_seq.ToString()))
{
await saveCaseSearch(SaveCaseSearchInput, AcctLst.ElementAt(0).o_case_seq);
}
console.writeline("Async called");
return AcctLst;
}
public async Task<ilist<savecasesearchoutput>> saveCaseSearch(SaveCaseSearchInput SaveCaseSearchInput,Int64? case_key)
{
..........................
SQL.CaseSQL.getSaveCaseSearchParameters(SaveCaseSearchInput, case_key, out strSPQuery, out listParam);
var AcctLst = await rep.ExecuteStoredProcedureAsync<entities.case.savecasesearchoutput>(strSPQuery, listParam);
return AcctLst;
}
这里的createCase
也遇到了await,应该立即返回并执行下一行代码,在SaveCaseSearch
完成之前打印Async called
是吗?
好的,如果我想的没错,可能会控制返回给调用者
。
所以,如果我将我的调用SaveCaseSearch
包装在另一个名为 SavCaseSearch
的async/await方法中,会怎样呢?
async DoWork() {....
}
直接从CreateCase()
调用DoWork()
,那么它会在遇到await
并且完成之前,持续打印“Async called”吗?
我的想法正确吗?
另外有时我看到这些术语会感到困惑
await someAsync()
它们之间有什么区别?应该遵循哪一个?
await Task.Run(() => someAsync())
...
async
,除非正确设置,否则可能会遇到问题,否则它可能不会按预期工作。请参见http://anthonysteele.co.uk/async-and-await-with-console-apps和http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx。 - Bradley Uffner