【发布时间】:2016-04-13 18:22:15
【问题描述】:
我只是这个异步事物世界的新手。
请原谅我缺乏知识。
据说当一个方法遇到await ... "它告诉awaitable在完成时运行该方法的剩余部分,然后从async方法返回。" 我没有得到这部分。
那么这是否意味着该方法仍然保持同步运行并等待直到可等待返回然后继续该方法的其余部分?
如果不是,请解释为什么需要Task.Run在后台或以一劳永逸的方式 运行方法。我仍然可以通过 await 实现对吗?即
该方法会继续执行其余的语句,而无需等待 await 返回。
我希望这类似于后台运行方法。或者不是吗?我很困惑。-
如果一个方法被标记为 async 和 await,而该方法又在一个单独的层中异步调用另一个方法,该层也被标记为 async 和 await ..
那么从单独的方法中调用标记为 async 和 await 的第一个方法的调用名称 ABC 应该是什么样子?
我不想将该方法注释为异步/等待。所以Task.Run(() => DoWork());来自 ABC() 没有标记为 async/await 就可以了吗?
还是违背了异步原则?
这就是我想要实现的目标......
public IList<CreateCaseOutput> ABC(CreateCaseInput CreateCaseInput,SaveCaseSearchInput SaveCaseSearchInput)
{
CaseSQL.getABCParameters(CreateCaseInput, RequestType, out strSPQuery, out listParam);
var AcctLst = rep.ExecuteStoredProcedure<CreateCaseOutput>(strSPQuery, listParam).ToList();
if (!string.IsNullOrEmpty(AcctLst.ElementAt(0).o_case_seq.ToString()))
{
Task.Run(async () =>
{
await DEF(SaveCaseSearchInput, AcctLst.ElementAt(0).o_case_seq);
}).ConfigureAwait(false);
}
console.writeLine("After Async called");
return AcctLst;
}
public async Task<SaveCaseSearchOutput>> DEF(SaveCaseSearchInput SaveCaseSearchInput,Int64? case_key)
{
CaseSQL.getDEFParameters(SaveCaseSearchInput, case_key, out strSPQuery, out listParam);
var AcctLst = await rep.ExecuteStoredProcedureAsync<SaveCaseSearchOutput>(strSPQuery, listParam);
return AcctLst;
}
需要在后台调用 async/await 的 DEF 并忘记来自 ABC 的方法,一旦被触发,我想继续使用 ABC 的其余部分并在后台运行 DEF。这种火灾和忘记方法有什么问题?如果我打电话给
只有
DEF(SaveCaseSearchInput, AcctLst.ElementAt(0).o_case_seq);
而不是
Task.Run(async () =>
{
await DEF(SaveCaseSearchInput, AcctLst.ElementAt(0).o_case_seq);
}).ConfigureAwait(false);
}
return AcctLst;
然后这段代码在调试器中同步运行。
我做错了吗?
【问题讨论】:
-
我想解释一下,但这里已经很简单了,看看这是否有帮助stephenhaunts.com/2014/10/10/…
-
一个很好的解释是here也一定要检查斯蒂芬的introductory article
-
我使用 Run 来将同步执行放在一个任务中(在任务线程池上运行)。即
var task = Task.Run(() => DoWork()); /** do something else **/ await task;
标签: c# .net multithreading asynchronous