【发布时间】:2016-08-07 19:50:30
【问题描述】:
好的,我希望我掌握了 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 秒后,主线程仍然继续并打印 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 也遇到了等待和
它应该立即返回并执行下一行本身并打印Async called
甚至在 SaveCaseSearch 完成之前?
好吧,如果我想大声的话,它可能是 control returns to the caller 。
如果我将我的调用 SavCaseSearch 包装在另一个名为假设的 async/await 方法中是不是这样
async DoWork() {....
}
然后直接从CreateCase() 调用这个DoWork()
It will go on printing "Async called" once call to DoWork() encounters await and before it even completes ?
我的想法是否正确?
有时我也会看到并混淆
await someAsync()
和
await Task.Run(() => someAsync())..
它们之间有什么区别?和哪一个?
【问题讨论】:
-
如果您尝试在控制台应用程序中使用
async,除非您正确设置它,否则您可能会遇到问题,否则它可能不会按预期运行。见anthonysteele.co.uk/async-and-await-with-console-apps 和blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx -
async是not about threads。 -
查看 Stephen Cleary 的帖子。很有用
标签: c# .net multithreading asynchronous async-await