2011-10-09 44 views
0

好吧,我已经阅读了关于多线程StackOverflow的其他一些帖子,但我没有看到一个回答我的具体问题。C#进程监控线程饲料AJAX控制台

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

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

+0

也许一个静态'class.variable'就是要走的路。 –

回答

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对象)。

有一点值得思考,但它是可行的。

+0

你认为使用Static类会更好吗?我在星期六晚上试了一下,似乎工作得很好,但我不确定这种异常情况。我要研究和测试你的方法。谢谢。 –