特定のスレッドが何らかの理由で失敗した場合、これにより無限ループが発生するようです。
これは私が書いたものではないため、編集することもできませんが、ここで最も明白な問題は、カウンター変数totalActions
が揮発性としてマークされていないことです。最新の値。
totalActions
の真の値を取得できない場合、待機し続けるように見えますか?
これにより、スレッドが再帰的に実行されますか? デバッグ中に、実行中のスレッドが失敗し (例外がスローされ)、何度も何度も呼び出され続けることに気付きました....
public void PerformActions(List<Action> actions)
{
object actionLock = new object();
int totalActions = actionts.Count;
for(int x = 0; x < accounts.Count; x++)
{
int y = x;
new Thread(delegate()
{
actions[y].Invoke();
if(Interlocked.Decrement(ref totalActions) == 0)
{
lock(actionLock)
{
Monitor.Pulse(actionLock);
}
}
}).Start();
}
lock(actionLock)
{
if(totalActions > 0)
{
Monitor.Wait(actionLock);
}
}
}
アップデート
使用法は次のようなもので、myService
はhttpRequest
API サービスから json リクエストを取得するための呼び出しを行っています。
Execute.InParallel(
new Action[]
{
() => { abc = myService.DoSomething(); },
() => { def = myService.DoSomethingElse(); }
});