gpt4 book ai didi

c# - 只要使用异步,ASP.Net MVC 4 Controller 就会挂起

转载 作者:太空狗 更新时间:2023-10-29 17:45:01 25 4
gpt4 key购买 nike

我将 Visual Studio 2012 RC 与 .Net 4.5 和 ASP MVC 4 RC 结合使用。每当我使用异步时它都会挂起。 Controller 操作方法使用异步但本身不是异步 Controller 方法。

没有错误记录或抛出异常,但浏览器永远显示“正在等待 www.myweb.local”。

// Simplest possible async
public class Waiter
{
public async Task<int> GetValue()
{
await Task.Yield();
return await Task.Factory.StartNew(() => 42);
}
}

// simplest possible controller that uses the async
public class HomeController : Controller

public ActionResult Index()
{
var waiter = new Waiter();
var resultTask = waiter.GetValue();
int result = resultTask.Result;

// it never gets here
return View();
}
}

注意的事情我都做了in this answer , 它仍然不起作用。IE。 web.config 包含

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>

魔术词 await Task.Yield(); 在异步方法中。

.Net 框架版本为 4.5.50501。我在 IIS Express 和 IIS 6.0 上观察到了这种行为。

我尝试将“2012 年 7 月更新”应用到 VS2012,但这并没有解决问题。

This answer suggests这可能是因为当我等待它时任务已经完成,但是如果是这样的话,这应该可以工作但它不会:

public class Waiter
{
public async Task<int> GetValue()
{
await Task.Yield();
return await Task.Factory.StartNew(() =>
{
Thread.Sleep(1500);
return 42;
});
}
}

一些人建议需要 ConfigureAwait(false),但这段代码也不起作用:

    public async Task<int> GetValue()
{
var task = new Task<int>(() => 42);
return await task.ConfigureAwait(false);
}

以下确实适用于 razor View 引擎,但不适用于 spark。当然应该有办法让其他场景也能正常工作?不能在同步代码中使用异步任务吗?

public class Waiter
{
public async Task<int> GetValue()
{
return await Task.Factory.StartNew(() => 42);
}
}

public class HomeController : Controller
{
public async Task<ActionResult> IndexAsync()
{
await Task.Yield();
var waiter = new Waiter();
int result = await waiter.GetValue();

return View();
}
}

我知道这不是已发布的软件,但 Microsoft 的 RC 通常非常稳定,所以我很惊讶它会失败,而且失败的方式毫无帮助。

最佳答案

你造成了一个死锁,just like this question .

James Manning 的建议是正确的,但是你必须await ConfigureAwait 的结果,像这样:

public async Task<int> GetValue()
{
var task = new Task<int> (() => 42);
return await task.ConfigureAwait(false);
}

一般来说,混契约(Contract)步和异步代码是一个非常糟糕的主意,除非你真的知道你在做什么。使 Controller Action 异步会好得多。

关于c# - 只要使用异步,ASP.Net MVC 4 Controller 就会挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11364272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com