提供AJAX控制台的c#进程监控线程



好吧,我已经在StackOverflow上读了很多关于多线程的帖子,但是我没有看到一个回答我的具体问题。

我有一个MVC 3应用程序,处理大约5000条记录从一个XML文档到一个数据库。我想让视图包含一个AJAX控制台,用于监视事务的进度(有多少成功写入,有多少失败,潜在的重复标志等)。我可以让一个控制器实例运行在取得进展时填充会话级变量的进程,并让另一个实例每隔1秒被AJAX控制台调用以获取会话变量值吗?

有更好的方法吗?多线程是我看到很多人提到的,但我没有看到任何解决方案,我可以直接应用。建议吗?

你的建议是可行的,但需要考虑一下。如果您有多个AJAX请求进入,那么IIS将在多个线程上处理这些请求,因此您进入了多线程。这意味着必须使对会话状态的访问成为线程安全的。所以你需要这样写:

// put an instance of this class in the user's Session
class Progress
{
    public object Locker { get; private set; }
    public Progress()
    {
        Locker = new Object();
    }
    public int SuccessCount { get; set; }
    public int FailureCount { get; set; }
    public int DuplicateCount { get; set; }
}
// update the counts in the processing logic inside a lock
Progress progress = Session[ ... ];
lock( progress.Locker )
{
    progress.SuccessCount = ...
    progress.FailureCount = ...
    progress.DuplicateCount = ...
}
// read the counts in the progress handler also inside a lock on the same object
Progress progress = Session[ ... ];
lock( progress.Locker )
{
    retval.SuccessCount = progress.SuccessCount;
    retval.FailureCount = progress.FailureCount;
    retval.DuplicateCount = progress.DuplicateCount;
}
return retval;

您还必须处理处理线程结束并在处理进度请求的同时删除会话对象的情况。此外,您可能必须在一个会话中处理多个处理线程(因此是Progress对象)。

最新更新