c# – 任务返回值,没有任务(async / await模式)
我想写下面的内容:
public string GetSomeValue() { //directly return the value of the Method 'DoSomeHeavyWork'... var t = DoSomeHeavyWork(); return t.Result; } public Task<string> DoSomeHeavyWork() { return Task.Run(() => { // do some long working progress and return a string return "Hello World!"; }); } 正如你可以看到从DoSomeHeavyWork()返回结果我已经使用了Task.Result属性,这可以正常工作,但根据研究,这将阻止线程. 我想使用async / await模式,但似乎无法找到如何做到这一点. public async Task<string> GetSomeValue() { //directly return the value of the Method 'DoSomeHeavyWork'... var t = DoSomeHeavyWork(); return await t; } public Task<string> DoSomeHeavyWork() { return Task.Run(() => { // do some long working progress and return a string return "Hello World!"; }); } 这个解决方案不太适合我的需求,因为我只想返回字符串而不是Task< string>,如何使用async / await实现这一点? 解决方法
你不能.
异步的全部要点是异步运行代码.因此代码返回未来字符串值的承诺,在.NET中表示为Task< string>. 以这种方式思考:如果您的代码调用公共字符串GetSomeValue(),那么在方法返回时,您已经有了一个字符串.根据定义,这是同步的. 在你的例子中,你有“沉重”的工作,我解释为“CPU限制”.在这种情况下,只需同步完成工作: public string DoSomeHeavyWork() { // do some long working progress and return a string return "Hello World!"; } 一般来说,API不应该“撒谎”;如果它们是同步的,那么它们应该具有同步(非任务返回)签名. 编辑:根据您的评论,“重”工作是一个WCF调用,它是I / O绑定的,而不是CPU绑定的. 在这种情况下,工作自然是异步的.使用异步WCF方法(不是Task.Run),并允许异步通过代码库增长: public async Task<string> GetSomeValueAsync() { //directly return the value of the Method 'DoSomeHeavyWork'... var t = DoSomeHeavyWorkAsync(); return await t; } public async Task<string> DoSomeHeavyWorkAsync() { // Call asynchronous WCF client. await ...; return "Hello World!"; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |