Viv*_*vek 8 c# multithreading task-parallel-library asp.net-web-api owin
有人能指出我的资源有助于解释web api(特别是使用Owin Self Host)如何处理请求取消?
这是我正在观察的事件序列:
GET铬制作Web Api接下来会发生什么?
在控制器中运行了一些代码,运行它的线程是否被中止?如果它是等待另一个任务的异步控制器,那么该任务是否仍然有一个等待,以防它返回异常?
对于上下文:我确实有一个async等待任务的控制器(这是唯一的调用站点),它看起来在某些边缘情况下抛出一个未观察到的异常.我还没有能够分离或重新生产:)
我确实找到了一些叫做的东西HttpResponse.ClientDisconnectedToken,但是不太清楚Owin Selfhost+是否支持它是否对所有用户取消都是好事.
正如您所说,您的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)
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |