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,
......