c# – 任务返回值,没有任务(async / await模式)

前端之家收集整理的这篇文章主要介绍了c# – 任务返回值,没有任务(async / await模式)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想写下面的内容
  1. public string GetSomeValue()
  2. {
  3. //directly return the value of the Method 'DoSomeHeavyWork'...
  4. var t = DoSomeHeavyWork();
  5. return t.Result;
  6. }
  7.  
  8. public Task<string> DoSomeHeavyWork()
  9. {
  10. return Task.Run(() => {
  11. // do some long working progress and return a string
  12. return "Hello World!";
  13. });
  14. }

正如你可以看到从DoSomeHeavyWork()返回结果我已经使用了Task.Result属性,这可以正常工作,但根据研究,这将阻止线程.

我想使用async / await模式,但似乎无法找到如何做到这一点.
如果我用async / await用我目前的知识做同样的事情,我将总是这样做:

  1. public async Task<string> GetSomeValue()
  2. {
  3. //directly return the value of the Method 'DoSomeHeavyWork'...
  4. var t = DoSomeHeavyWork();
  5. return await t;
  6. }
  7.  
  8. public Task<string> DoSomeHeavyWork()
  9. {
  10. return Task.Run(() => {
  11. // do some long working progress and return a string
  12. return "Hello World!";
  13. });
  14. }

这个解决方案不太适合我的需求,因为我只想返回字符串而不是Task< string>,如何使用async / await实现这一点?

解决方法

你不能.

异步的全部要点是异步运行代码.因此代码返回未来字符串值的承诺,在.NET中表示为Task< string>.

以这种方式思考:如果您的代码调用公共字符串GetSomeValue(),那么在方法返回时,您已经有了一个字符串.根据定义,这是同步的.

在你的例子中,你有“沉重”的工作,我解释为“@R_301_456@限制”.在这种情况下,只需同步完成工作:

  1. public string DoSomeHeavyWork()
  2. {
  3. // do some long working progress and return a string
  4. return "Hello World!";
  5. }

一般来说,API不应该“撒谎”;如果它们是同步的,那么它们应该具有同步(非任务返回)签名.

编辑:根据您的评论,“重”工作是一个WCF调用,它是I / O绑定的,而不是@R_301_456@绑定的.

在这种情况下,工作自然是异步的.使用异步WCF方法(不是Task.Run),并允许异步通过代码库增长:

  1. public async Task<string> GetSomeValueAsync()
  2. {
  3. //directly return the value of the Method 'DoSomeHeavyWork'...
  4. var t = DoSomeHeavyWorkAsync();
  5. return await t;
  6. }
  7.  
  8. public async Task<string> DoSomeHeavyWorkAsync()
  9. {
  10. // Call asynchronous WCF client.
  11. await ...;
  12. return "Hello World!";
  13. }

猜你在找的C#相关文章