2013-01-16 185 views
2

我有一个asp.net web应用程序,并在一个表单中使用异步过程。队列异步任务操作?

Task.Run(async() => 
      { 
       foreach (ListItem item in cbListFaculties.Items) 
       { 
        if (item.Selected) 
        { 
         service.FinishSyncDepartment(actionId, item.Value); 
        } 
       } 
      }); 

但我想要做的是什么,如果任务已经开始,用户再次点击该网页,我想说的是,这个任务还没有停止呢,所以你不能继续。

我怎样才能解决这个问题?任何想法?

谢谢。

+1

通过使用像静态变量/会话变量一些共享资源同步的多个页面请求? – sll

+1

要阐述什么是SLL说,在会话状态变量或一些其他形式的持续性,设置一个标志说进程已经开始,然后开始过程,当它完成,重置标志。当用户进入页面时,检查标志。如果已设置,则警告他们该流程目前正在运行。那时,你可以做任何事情。你可以每隔几秒钟刷新,直到标记被复位,或将其发送到另一个页面,等... – Pete

+0

是参考到'Task'活着,或者你做一个完整的页面重载和宽松的参照任务?如果是这样,那么可能需要保存对该任务的引用以便稍后使用它。要做到这一点,您可以(例如)将任务声明和启动移动到另一个不依赖于您的页面的类。例如,使用一些静态类,以便任务将在页面重新加载后出现。 – 0x49D1

回答

0

您可以创建Task对象(而不是一次运行它)并使用IsCompleted property来检查它是否已完成。或者你可以使用一些线程安全对象(静态字段)来标记该任务正忙。

如果您需要在任务期间重新加载页面生存 - 比你要保存以某种方式引用到Task对象(饼干,会话,静态变量,视图状态,高速缓存,数据库......)

0

你应该保留到后面的代码里面的任务的引用,所以如果Task尚未设置,则任务还没有完成。

+0

一旦将响应发送到客户端,代码隐藏页面引用就会被销毁。例如,当用户刷新刷新时,通常会在服务器上创建新的页面实例,因此任务引用将丢失。 –

+0

@HonzaBrestan是的CodeBehind被销毁了,但他可以在Session或ViewState中保留引用。 – Romoku

+0

ViewState被序列化并发送到客户端。你很难用一个参考来做到这一点。使用会话可能,但是我会说这是个坏主意 - 会话可能随时被刷新,也可能需要序列化(例如,当存储在数据库或会话服务器中时) –

0

不喜欢0x49D1写,而是把任务对象的会话,并不会在网络上使用静态字段。