0

複数のスレッドを実行するサービスを作成しました。各スレッドと個別に通信する必要はありませんが、一度にすべてのスレッドと通信する必要があります。ハンドラーを介した通信を可能にするこの記事を見つけました。サービス エンドポイントとして WCF を使用していますが、ハンドラーではなく 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 ++;
            }
        }
    }

すべてのスレッドによって処理されるデータの量を追跡するグローバル変数が必要です。そのため、各スレッドがデータを処理するたびに更新され続けるものがあります。さらに、クライアント側のコマンドからすべてのスレッドを一時停止する機能が必要です。Ajax リクエストを実行するか、MVC からフォームを送信するかは問題ではありません。この記事では、1 つのスレッドを一時停止する方法を説明していますが、複数のスレッドに適用できるかどうかはわかりません。

4

1 に答える 1

2

Interlocked.Increment(ref toYourGlobalMember) を使用して、スレッドセーフ モードで整数をインクリメントできます。

キャンセルについては、TPL とキャンセル トークンを試してみてください。

于 2012-08-29T12:55:34.663 に答える