OWIN SelfHost Web Api - 请求取消 - 如何完成?线程中止?

Viv*_*vek 8 c# multithreading task-parallel-library asp.net-web-api owin

有人能指出我的资源有助于解释web api(特别是使用Owin Self Host)如何处理请求取消?

这是我正在观察的事件序列:

  • 有人用GET铬制作
  • Api控制器(通过某些层)触发异步SQL查询
  • 某人点击了chrome中的X按钮(我不知道套接字上究竟发生了什么)

Web Api接下来会发生什么?

在控制器中运行了一些代码,运行它的线程是否被中止?如果它是等待另一个任务的异步控制器,那么该任务是否仍然有一个等待,以防它返回异常?

对于上下文:我确实有一个async等待任务的控制器(这是唯一的调用站点),它看起来在某些边缘情况下抛出一个未观察到的异常.我还没有能够分离或重新生产:)

我确实找到了一些叫做的东西HttpResponse.ClientDisconnectedToken,但是不太清楚Owin Selfhost+是否支持它是否对所有用户取消都是好事.

VMA*_*Atm 0

正如您所说,您的async控制器正在等待 a Task,有时会出现一些异常,我建议您ContinueWith为任务扩展方法,该方法只有在您的任务出现故障时才能运行,如下所示:

task.ContinueWith(
       t =>
       logger.Error(t.Exception.Message, t.Exception);
       , TaskContinuationOptions.OnlyOnFaulted);
Run Code Online (Sandbox Code Playgroud)

这是处理异常的默认机制,这将在 OWIN 应用程序中起作用。

其次,关于取消:任务可以用一个CancellationToken结构体来启动,该结构体可以用于在执行过程中取消任务。您可以在 MSDN 文章中阅读更多内容

HttpResponse.ClientDisconnectedToken用于客户端已断开连接且请求不应继续执行的情况。

您可以使用此令牌,或使用 创建自己的令牌CancellationTokenSource,如下所示:

var source = new CancellationTokenSource();
var token = source.Token;

var task = Task.Factory.StartNew(() =>
{

    // Were we already canceled?
    ct.ThrowIfCancellationRequested();

    var moreToDo = true;
    while (moreToDo)
    {
        // Poll on this property if you have to do 
        // other cleanup before throwing. 
        if (ct.IsCancellationRequested)
        {
            // Clean up here, then...
            ct.ThrowIfCancellationRequested();
        }

    }
}, token);
Run Code Online (Sandbox Code Playgroud)