MVC 5中的异步操作

3

我不确定在MV5中正确使用异步操作的方法。

我不知道应该使用哪个。

是这个吗:

public async Task<ActionResult> Index(CancellationToken ct)
{
    var result = await service.GetData(ct);
    return View(result);
}

This:

public async Task<ActionResult> Index(CancellationTokenSource cts)
{
    var result = await service.GetData(cts.Token);
    return View(result);
}

或者这个:
public async Task<ActionResult> Index()
{
    var cts = CancellationTokenSource.CreateLinkedTokenSource(Request.TimedOutToken, Response.ClientDisconnectedToken);

    var result = await service.GetData(cts.Token);
    return View(result);
}

它们之间有什么区别?

我不知道为什么你会将 CancellationTokenCancellationTokenSource 作为 ASP.NET MVC 操作的参数传递进来。 - Justin Helgerson
我也不知道为什么,但我找到了一些做这个的例子。 - user3900456
第二个执行了吗? - Stephen Cleary
@StephenCleary,是的。 - user3900456
1个回答

3
第一个例子接受MVC传递的CancellationToken。我认为第二个例子根本行不通。第三个例子从ASP.NET获取了两个CancellationToken并将它们合并。
你应该使用第一个例子,可能还要加上AsyncTimeoutAttribute。据我所知,Response.ClientDisconnectedToken存在一个bug,防止在生产代码中使用它。
至于“为什么”,这是为了允许取消请求(例如,如果它们已经进行了太长时间)。对于同步方法,ASP.NET会简单地Thread.Abort分配给请求的线程;对于异步方法,ASP.NET必须更友好,只需设置一个取消标记。

嗯...所有三个都正常工作,我正在尝试弄清楚第二个是否与第三个相同。谢谢! - user3900456
ASP.NET Web API在操作中如果存在CancellationToken类型的参数,它也会提供一个CancellationToken吗? - Timothy Shields
@TimothyShields:是的。 - Stephen Cleary
@StephenCleary:你说Response.ClientDisconnectedToken存在一个bug?我在任何地方都找不到关于这个的信息。你有什么来源或其他信息可以解释为什么不能使用它吗? - DeCaf
@DeCaf:这个帖子指出了一个bug,还有另外一个。同样的帖子提到另外那个bug已经在.NET 4.5.1中修复了,但是我不知道ClientDisconnectedToken这个bug是否被修复过。SignalR团队可能会知道。 - Stephen Cleary
@StephenCleary:好的,谢谢,我想在这种情况下我将不得不进一步与他们进行调查。 - DeCaf

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