OFFICE COMベースのプログラムプール

3471 ワード

この方式によりWORDのプロセス数を制御し,呼び出しの速度を速めることができる.しかし、検証では、より多くのプロセスが全体の応答速度を速めることはなく、WORDの処理には大量のCPUを消費する必要があるため、この方式を採用することで、WORDの処理によるCPUの消費を制限することができる(当初はWORDの処理の同時効率を提供したいが)

    public class OfficePoolUtil
    {
        private static WordAppPool[] wordAppPools;
        public static int createWordAppPool(int iRate)
        {
            //int iCpuCount = Convert.ToInt32(System.Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS"));
            //iCpuCount = iCpuCount * iRate;
            //wordAppPools = new WordAppPool[iCpuCount];
            int iCpuCount = iRate;
            wordAppPools = new WordAppPool[iCpuCount];
            for (int i = 0; i < iCpuCount; i++)
            {
                wordAppPools[i] = new WordAppPool();
                wordAppPools[i].ap_wordAppInstance = new Word.ApplicationClass();
                wordAppPools[i].ap_wordAppInstance.Visible = false;
                wordAppPools[i].ap_wordAppInstance.ScreenUpdating = false;
                wordAppPools[i].ap_count = 0;
                //wordAppPools[i].ap_isFree = true;
            }
            return iCpuCount;
        }

        public static void cleanWordAppPool()
        {
            object savechange = Word.WdSaveOptions.wdDoNotSaveChanges;
            Object missing = Missing.Value;

            for (int j = 0; j < wordAppPools.Length; j++)
            {
                wordAppPools[j].ap_wordAppInstance.Quit(ref savechange, ref missing, ref missing);
                ReleaseCOM(wordAppPools[j].ap_wordAppInstance);
                wordAppPools[j].ap_wordAppInstance = null;

            }
            wordAppPools = null;
        }

        public static Word.ApplicationClass getWordAppInstance()
        {
            int iMin = wordAppPools[0].ap_count;
            int iIndex = 0;
            for (int j = 1; j < wordAppPools.Length; j++)
            {
                if (iMin > wordAppPools[j].ap_count)
                {
                    iMin = wordAppPools[j].ap_count;
                    iIndex = j;
                }
            }
            wordAppPools[iIndex].ap_count++;
            return wordAppPools[iIndex].ap_wordAppInstance;

        }

        private static void ReleaseCOM(object o)
        {
            try
            {
                //System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(o);
            }
            catch
            {
            }
            finally
            {
                o = null;
            }
        }

    }


    public class WordAppPool
    {
        /// <summary>
        /// word app
        /// </summary>
        public Word.ApplicationClass ap_wordAppInstance;

        public bool ap_isFree;

        public Int32 ap_count;
    }


コールモード

                    wordDoc = OfficePoolUtil.getWordAppInstance().Documents.Open(ref Filename,
......