Node.Textインデックスに基づいてサブノードを追加しようとするツリービューに問題があります(intインデックスに基づいてこれも試しましたが、役に立ちませんでした)。これは、同期して実行するとうまく機能します。ただし、まったく同じものAsync(backgroundWorker)を実行すると、未処理のArgumentOutOfRange例外がスローされます。もう1つの奇妙な部分は、2つの異なる領域でこの例外をキャッチしようとしたことです。コードを参照してください:
using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
int x = 0;
foreach (string subkey_name in key.GetSubKeyNames())
{
using (RegistryKey subkey = key.OpenSubKey(subkey_name))
{
foreach (string a in (string[])subkey.GetValue("Users", ""))
{
User u = new User(a);
usrs.addUser(new User(a));
wgs.addUserToWorkgroup(subkey_name, a);
usrs.AddWorkGroupToUser(subkey_name, a);
int trycount = 0;
TryAgain:
try
{
//here is where the exception occurs
ExecuteSecure(() => treeView1.Nodes[subkey_name].Nodes.Add(a, a));
}
catch (ArgumentOutOfRangeException)//This does not catch it.
{
trycount++;
if (trycount < 100)
{
goto TryAgain; //b/c I cannot catch it this never happens...
}
}
}
}
x++;
//System.Threading.Thread.Sleep(2);
//As you can see I've tried to let the tread sleep to resolve this
//- it will get a little farther but still eventually bomb out.
}
}
これがExecuteSecureコードです(https://stackoverflow.com/a/8021020/1387186)
private void ExecuteSecure(Action a)
{
o = new object();
try
{
if (InvokeRequired)
{
lock (o)
{
BeginInvoke(a);
}
}
else
a();
}
catch (Exception) //again **sigh** this does not catch the error
{ }