C#进程监控线程来提供AJAX控制台

时间:2011-10-09 04:47:27

标签: ajax multithreading asp.net-mvc-3

好的,我已经阅读了StackOverflow上关于多线程的其他一些帖子,但我没有看到一个能回答我特定问题的帖子。

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

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

1 个答案:

答案 0 :(得分:1)

你的建议是可行的,但需要一些思考。如果您有多个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个对象)。

有一些想法,但它是可行的。