我想写下以下内容:
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模式,但似乎无法找到如何做到这一点。 如果我用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实现?
答案 0 :(得分:11)
你不能。
async
的全部内容是异步运行代码 。因此,代码返回未来string
值的 promise ,在.NET中表示为Task<string>
。
以这种方式思考:如果您的代码调用public string GetSomeValue()
,那么在方法返回时,您已经一个string
。根据定义,这是同步的。
在你的例子中,你有&#34;沉重的&#34;我解释的工作意味着&#34; CPU-bound&#34;。在这种情况下,只需同步完成工作:
public string DoSomeHeavyWork()
{
// do some long working progress and return a string
return "Hello World!";
}
一般来说,API不应该&#34;谎言&#34 ;;如果它们是同步的,那么它们应该具有同步(非Task
- 返回)签名。
修改:根据您的评论,&#34;重&#34; work是一个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!";
}