none
如何解决mvc的action执行时间过长造成其他用户操作无响应的问题? RRS feed

  • 问题

  • 如题所问,假如用户点了打开一个页面的操作,但是这个页面后台执行时间很长,要几分钟,这个时候用户点其他操作的时候,要等待之前的后台执行完成才执行。如果用户在等待过程中不想做这个操作了,有办法取消后台执行吗?

     

    • 已移动 Leo Liu - MSFT 2011年1月13日 4:48 Off-Topic, moved for better support. (发件人:Visual C#)
    2011年1月11日 9:27

答案

  • 如果是在同步状态下,没有办法取消。

    如果您的 Action Method 是异步实现的,比如利用了 IAsyncResult 或者 TPL,或者有 await/async 关键字 (C# 5.0) 的,则可以利用 CancellationToken 来取消操作。

    不过,如果要采用异步,那么客户端必须利用 MVC 的 AJAX Helpers 来调用 Action。或者自己写 JavaScript 脚本。目的是让客户端早点能显示出那个正在处理中的提示和取消按钮。


    Mark Zhou
    2011年1月11日 9:52
  • 您好,请参考:

    1、将这个长时间运行的Action里的代码重构,然后用多线程的方法,把重构后的代码在新线程中执行。

    2、设计一系列的静态变量来体现新线程中执行的情况。(因为web是面向非连接的编程)

    3、如果要取消,则有些复杂,需要设计一个静态变量来表示是否被用户取消,然后在重构后的代码中设置好查询该静态变量的位置。

    4、以上静态变量需要保证单个客户的唯一性,可以将静态变量放到一个静态字典中,主键可以用SessionID来标示。

    2011年1月11日 16:56
    版主

全部回复

  • 如果是在同步状态下,没有办法取消。

    如果您的 Action Method 是异步实现的,比如利用了 IAsyncResult 或者 TPL,或者有 await/async 关键字 (C# 5.0) 的,则可以利用 CancellationToken 来取消操作。

    不过,如果要采用异步,那么客户端必须利用 MVC 的 AJAX Helpers 来调用 Action。或者自己写 JavaScript 脚本。目的是让客户端早点能显示出那个正在处理中的提示和取消按钮。


    Mark Zhou
    2011年1月11日 9:52
  • 您好,请参考:

    1、将这个长时间运行的Action里的代码重构,然后用多线程的方法,把重构后的代码在新线程中执行。

    2、设计一系列的静态变量来体现新线程中执行的情况。(因为web是面向非连接的编程)

    3、如果要取消,则有些复杂,需要设计一个静态变量来表示是否被用户取消,然后在重构后的代码中设置好查询该静态变量的位置。

    4、以上静态变量需要保证单个客户的唯一性,可以将静态变量放到一个静态字典中,主键可以用SessionID来标示。

    2011年1月11日 16:56
    版主