サードパーティのプログラムとやり取りするプログラムを書いています。このサードパーティ プログラムにより、ユーザーは、サードパーティ プログラムで作成されたステップの記録を実行できるボタンを作成できます。しかし!これらのボタンは、ユーザー定義のバッチ ファイルを実行することもできます。そのため、この機能を使用して、ファイルを作成し、これらのファイルが存在するかどうかを確認して、プログラムとやり取りします。
私のプログラムは、Actionlistener と Actionperformer の 2 つのクラスで構成されています。actionperformer には、可能なアクションの列挙が含まれています。
読み取り関数は次のようになります。
static public void CheckForActions()
{
//For every action in the Enum
foreach (ActionPerformer.PossibleActions action in Enum.GetValues(typeof(ActionPerformer.PossibleActions)))
{
//If a file exists with the same name as the current action
if (File.Exists(_location + action.ToString()))
{
//Delete "message" and create a new thread to perform this action.
File.Delete(_location + action);
Thread _t = new Thread(() =>
{
new ActionPerformer(action);
});
_t.SetApartmentState(ApartmentState.STA);
_t.Start();
//Add thread to list so they can be joined propperly
_list.Add(_t);
//Write information to log
Logger.LogInfo(_t, "Starting new action: " + action.ToString(), DateTime.Now);
}
}
//If there are items in the list
if (_list.Count > 0)
{
//Dispose every thread once its done.
foreach (Thread _t in _list)
{
_t.Join();
Logger.LogInfo("Finishing action.", DateTime.Now);
}
_list.Clear();
}
}
ActionPerformer クラスは次のようになります。
class ActionPerformer
{
public enum PossibleActions
{
action1,
action2,
}
public ActionPerformer(PossibleActions action)
{
Logger.LogInfo(action.ToString(), DateTime.Now);
}
}
したがって、 action1 を parameter としてプログラムを実行し、ロガー出力を読み取ると、次のような結果が得られるはずです。
Starting new action: action1 [13:30:05]
action1 [13:30:05]
Finishing action. [13:30:05]
しかし、初めて CheckForActions を呼び出すと、常に次の出力が得られます。
Starting new action: action1 [13:30:05]
action2 [13:30:05] //Notice how it is not action1?
Finishing action. [13:30:05]
2回目にCheckForActionsを呼び出すと、すべてが期待どおりに機能します...
誰が何が起こっているのか知っていますか?