将一个Task <t>添加到方法的返回中是否使它在一个线程中运行?

时间:2018-02-21 08:40:13

标签: c# .net async-await task

我正在努力在网上找到任何可靠的信息,但我们假装我有一个如下方法:

public int DoSomething()
{
    // some sync logic that takes a while
    return someResult
}

因此我们假设它是一个完全同步的方法,并且当前将阻止调用者开启的线程持续100ms。那么就让我说我想创建一个在执行时不会阻塞该线程的版本,它就像刚刚做的一样简单:

public Task<int> DoSomethingAsync()
{
    // some sync logic that takes a while
    return Task.FromResult(someResult)
}

据我所知Task.Run会导致代码在一个线程中执行,但是.net基本上解释了Task/<T>返回类型的任何方法应该是非阻塞的吗?

(我犹豫是否使用async一词,因为它在.net中有混合含义,但如上所示,这里没有等待使用)

1 个答案:

答案 0 :(得分:3)

没有。所有改变返回类型的都是......改变返回类型。

你正在改变你的承诺#34;当我回来时,我会给你一个int&#34;当我回来时,我会给你一些最终会提供int&#34; (实际上,该值可能已经可用,但需要注意)。

方法如何<{1}}完全是内部实现细节,这是您的方法所关注的问题。在您当前更改的实现中,它通过完全在调用它的同一个线程上运行,然后在最后将结果填充到Task中来实现它 - 没有真正的好处。

如果您添加了Task关键字并离开了async行,那么编译器就会为您提供更多线索:

  

return someResult;方法缺少&#39; async&#39;运营商并将同步运行。考虑使用......