Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net MVC控制器上执行AYSN同步操作_C#_Asp.net Mvc_Multithreading_Asynchronous - Fatal编程技术网

C# 在asp.net MVC控制器上执行AYSN同步操作

C# 在asp.net MVC控制器上执行AYSN同步操作,c#,asp.net-mvc,multithreading,asynchronous,C#,Asp.net Mvc,Multithreading,Asynchronous,我有一个任务需要在控制器处理一个请求并且响应返回到客户端之后执行。为此,我在控制器上重写了OnActionExecuted()事件,并在此方法中调用任务 由于任务可能需要一些时间才能运行并返回void,因此我想异步调用它,以便重写的OnActionExecuted()方法可以立即返回,并且在任务执行时可以将响应发送到客户端。我已尝试使用下面的代码,使用Task.Run()(在.net 4.5中)来实现这一点 然而,这并不能产生预期的效果。当我单步执行代码时,它仍然同步执行,WrapUp()方法中

我有一个任务需要在控制器处理一个请求并且响应返回到客户端之后执行。为此,我在控制器上重写了
OnActionExecuted()
事件,并在此方法中调用任务

由于任务可能需要一些时间才能运行并返回void,因此我想异步调用它,以便重写的
OnActionExecuted()
方法可以立即返回,并且在任务执行时可以将响应发送到客户端。我已尝试使用下面的代码,使用
Task.Run()
(在.net 4.5中)来实现这一点

然而,这并不能产生预期的效果。当我单步执行代码时,它仍然同步执行,
WrapUp()
方法中的所有内容都在
OnActionExecuted()
方法退出之前被调用。当
WrapUp()
方法挂起时,客户端将等待任务完成,然后再接收响应


我需要做什么才能使这项工作按预期进行?

操作执行的
将立即返回,因为在内部,您只是在创建和启动一项任务。你观察到的行为是不正常的。如果尝试以下操作,会发生什么情况:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    Task.Run(() => Thread.Sleep(10000));
}

客户端不需要等待10秒才能获得结果,是吗?

是的,客户端根本不需要等待线程.Sleep()是正确的。我所观察到的行为非常奇怪,因为每次提出请求时,它似乎并不一致——但在我处理请求时,总会有一定程度的等待时间。我可以看到OnActionExecuted方法退出,但浏览器仍然在等待响应,即使在这一点之后。更详细地说,WrapUp方法实际上在控制器上的注入依赖项上调用一个方法,这反过来又在更多注入依赖项上调用方法(我使用StructureMap for IoC)。当我逐步完成调用堆栈的后几个阶段时,响应似乎终于发出了。它似乎在等待,直到部分或所有注入的依赖项从内存中释放出来——这可能吗?好吧,浏览器应该在执行了
OnActionExecuted
方法之后等待也是正常的。这不是执行管道中的最后一个方法。之后还有很多事情要做。查找、准备和渲染视图本身等工作也可能需要一些时间。例如,
OnResultExecuting
OnResultExecuted
,…是的,我希望会有一些延迟。但是我通过允许调用堆栈从Task.Run()启动的线程内部继续来触发接收到的响应。奇怪的是,它在调用堆栈中并不总是相同的点。
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    Task.Run(() => Thread.Sleep(10000));
}