好的,我已经阅读了StackOverflow上关于多线程的其他一些帖子,但我没有看到一个能回答我特定问题的帖子。
我有一个MVC 3应用程序,它将大约5000条记录从XML文档处理到数据库中。我希望视图包含一个AJAX控制台,它监视事务的进度(成功写入多少,失败多少,潜在的重复标记等)。我是否可以让一个控制器实例运行该进程,在进程完成时填充会话级变量,并让另一个实例刚刚以1秒的间隔由AJAX控制台调用以获取会话变量值?
有更好的方法吗?多线程是我看到的很多人所指的,但我没有看到任何我可以直接应用的解决方案。建议?
答案 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
个对象)。
有一些想法,但它是可行的。