与MVC应用程序中的线程通信?

时间:2012-08-29 12:39:14

标签: c# multithreading asp.net-mvc-3 asp.net-mvc-4

我创建了一个运行多个线程的服务。我不需要单独与每个线程进行通信,而是需要同时与所有这些进行通信。我找到了这个article,它允许通过处理程序进行通信。我使用WCF作为我的服务端点,并想知道我是否可以与它进行通信而不是处理程序。以下是我在服务中所做的一些示例代码:

public class ThreadCoordinator
    {
        private int _numberOfThreads = 10;
        private List<Thread> _threads;

        public ThreadCoordinator()
        {
            _threads = new List<Thread>();
        }

        private void StartThreads()
        {
            for (int t = 0; t < _numberOfThreads; t++)
            {
                var st = new TheThread();
                var thread = new Thread(new ThreadStart(st.Run));
                _threads.Add(thread);
                thread.Start();
            }
        }

        public void RunThreads()
        {
            try
            {
                StartThreads();
            }
            finally
            {
                WaitForAllThreads();
                CloseAllConnections();
            }
        }

        private void WaitForAllThreads()
        {
            foreach (Thread t in _threads)
            {
                t.Join();
            }
        }


        private void CloseAllConnections()
        {
            //do some stuff to clean up resources
        }
    }

    internal class TheThread
    {
        public void Run()
        {
            //Do The work and update a global variable
            foreach(var person in somePersonList)
            {
                //do some work on that person 
                _someGlobalIntegerMember ++;
            }
        }
    }

我想要一个全局变量来跟踪所有线程处理的数据量。因此,每个线程处理数据时都会不断更新。更重要的是,我希望能够从客户端的命令暂停所有线程。如果我从MVC执行ajax请求或表单提交并不重要。这个article说明了如何暂停一个线程,但我不确定它是否可以应用于多个线程。

1 个答案:

答案 0 :(得分:2)

您可以使用Interlocked.Increment(ref toYourGlobalMember)在线程安全模式下增加整数。

关于取消,也许你可以试试TPL和取消令牌。