为什么调用task.run函数时,我的异步函数会挂起?

4
我希望把一个函数变成异步的,因为我想要把结果返回给用户界面,并且不希望让它卡住,但实际上它还是会卡住。
有人可以告诉我为什么会卡住吗?
public ActionResult Index()
{
    return View(FunctionThreeAsync().Result);
}

private async Task<MyType> FunctionThreeAsync()
{
    return await FunctionThree();
}

private Task<MyType> FunctionThree()
{
    return Task.Run<MyType>(() => { /* code */ });
}

1
返回View(await FunctionThreeAsync()); - user5089754
1个回答

8

This:

return View(FunctionThreeAsync().Result);

死锁可能会阻塞您的代码。 您不应该在异步方法上进行阻塞。相反,将您的方法标记为async,使其返回一个Task<T>并使用await调用:

public async Task<ActionResult> DoStuffAsync()
{
    return View(await FunctionThreeAsync());
}

异步操作从头到尾。当你有一个异步的方法时,它需要被异步地等待,而不是同步地阻塞。这意味着在你的代码库中需要使用 async


1
七月份的MSDN杂志中有一篇关于棕地异步(brownfield async)的文章,其中提到了一些关于阻塞等方面的有趣笔记。你可以在以下链接找到该文章:https://msdn.microsoft.com/zh-cn/magazine/mt238404 - Mark Schultheiss
这是另一篇值得一读的好文章:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html 此外,还可以查看该文章底部的资源。 - Cory
1
@KoBE 这就是我在回答中提到的那篇文章 :) - Yuval Itzchakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接