ThreadPool.QueueUserWorkItem コマンドを介して実行時間の長いタスクを開始するプロセスがあります。
内部の各タスクは、AppDomain.CreateDomain 呼び出しを介して新しい AppDomain を読み込み、一連のものを処理して終了します。場合によっては、これらのアプリ内の処理に時間がかかりすぎて、実行時間が長すぎると中止する必要があります。
AppDomains が適切にアンロードされるように、知らないうちにこれらのスレッドを外部から中止できるかどうかを知りたいですか?
以下のコードでわかるように、現在 appdomain はローカル変数として作成されていますが、必要に応じてクラス メンバーに移動できます。スレッドを強制終了するための最善の方法は、try/catch 全体の「finally」句で行われるように、その appdomain をアンロードすることです。ただし、AsyncExecute は中止する呼び出し元とは別のスレッドで実行されるため、「外部から」(appdomain) にアクセスできるかどうかはわかりません。
タスクの処理を開始する関数は次のとおりです。
public void AsyncExecute(RunningState runningState)
{
RunningState returnedState = null;
AppDomain runningApp = null;
try
{
{
var ads = new AppDomainSetup
{
ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
DisallowBindingRedirects = false,
DisallowCodeDownload = false,
ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
};
runningApp = AppDomain.CreateDomain("RemoteMonitor_" + runningState.LocalAccountInfo.Id, null,
ads);
var sub =
runningApp.CreateInstanceAndUnwrap("Processor", "Processor.ProcessorSub")
as ProcessorSub;
if (sub != null)
{
returnedState = sub.Run(runningState);
}
else
Logger.Instance.WriteCritical<ExecutableItem>("Cannot create Processor object");
}
}
catch (Exception ex)
{
Logger.Instance.WriteError<ExecutableItem>( ex.Message, ex);
}
finally
{
if (runningApp != null)
AppDomain.Unload(runningApp);
if (_onCompleteHandler == null)
Logger.Instance.WriteCritical<ExecutableItem>("Cannot complete task");
else
_onCompleteHandler.Invoke(returnedState);
}
}