Программа работает некорректно без прерывание потока System.Threading.Thread.Sleep

Создал shell extension с помощью sharpshell, который меняет имена файлов и папок на случайные. Однако без System.Threading.Thread.Sleep программа изменяет имя только у 1 объекта из множества выделенных. Почему так? Я сделал где-то ошибку, что пришлось использовать костыль или это должно там быть?

namespace FileSystemScanner
{
    [ComVisible(true)]
    [COMServerAssociation(AssociationType.AllFiles)]
    [COMServerAssociation(AssociationType.Directory)]
    public class FileInfoExtension : SharpContextMenu
    {
        protected override bool CanShowMenu()
        {
            return true;
        }

        protected override ContextMenuStrip CreateMenu()
        {
            // create the menu strip.
            var menu = new ContextMenuStrip();
            var RenameFileItem = new ToolStripMenuItem
            {
                Text = "Случайное имя",
                Image = Properties.Resources.random
            };
            RenameFileItem.Click += (sender, args) => RenameFile();
            menu.Items.Add(RenameFileItem);
            return menu;
        }

        private void RenameFile()
        {
            foreach (var filePath in SelectedItemPaths)
            {
                string oldname = Path.GetFullPath(filePath);
                string patchwitoutname = Path.GetDirectoryName(filePath);
                string exten = Path.GetExtension(filePath);


                System.Threading.Thread.Sleep(1);


                System.IO.Directory.Move(oldname, patchwitoutname + "\\" + GeneratedName() + exten);
            }

        }

        public string GeneratedName()
        {
            string parameters = "abcdefghijklnopqrstuvwxyz1234567890";
            int count = 13;
            string result = "";
            Random rnd = new Random();
            int lenght = parameters.Length;
            for (int i = 0; i < count; i++)
            {
                result += parameters[rnd.Next(lenght)];
            }
            return result;
        }
    }

}

Ответы (1 шт):

Автор решения: Александр Соболев

В .NET Framework, если часто создавать новые экземпляры Random, то они все будут генерировать одинаковые последовательности, т.к. по умолчанию для исходного значения используется системное время. Системное время обновляется примерно раз в 16мс.

Нужно вынести создание экземпляра из метода GenerateName куда-нибудь туда, где он не будет создавать много раз.

private static readonly Random rnd = new Random();
 
        public string GeneratedName()
        {
            string parameters = "abcdefghijklnopqrstuvwxyz1234567890";
            int count = 13;
            string result = "";
            // Random rnd = new Random();
            int lenght = parameters.Length;
            for (int i = 0; i < count; i++)
            {
                result += parameters[rnd.Next(lenght)];
            }
            return result;
        }
→ Ссылка