Tra22 Ответов: 2

Хотите добавить мульти-поток к функции getsize для проверки мульти-размера с тем же временем. Я пытаюсь добавить его, но все еще не могу.


static    public void getSize(string pathLocation)
{

    DirectoryInfo dInfo = new DirectoryInfo(pathLocation);
    sizeOfDirKb = DirectorySize(dInfo, true) / (1024);


    adminProcess = new System.Diagnostics.ProcessStartInfo();

    TotalSizeOfFolderByte = sizeOfDirKb / (1024 * 1024);

    if (TotalSizeOfFolderByte < 100)
    {
        TotalSizeOfFolder = Math.Floor(TotalSizeOfFolderByte * 100) / 100;

    }
    else if (TotalSizeOfFolderByte >= 100)
    {
        TotalSizeOfFolder = Math.Floor(TotalSizeOfFolderByte);
    }
}

static int i=0;

static   double DirectorySize(DirectoryInfo dInfo, bool includeSubDir)
{
    totalSize = dInfo.EnumerateFiles()//double
                .Sum(file => file.Length);//double
    Total = Total + totalSize / 1024 / 1024 / 1024;//double
    total1[i] = Total;//double

    if (includeSubDir)
    {
        totalSize += dInfo.EnumerateDirectories()
                 .Sum(dir => DirectorySize(dir, true));

    }

    return totalSize;
}


Что я уже пробовал:

Многопоточность и многозадачность, но все равно не могут.

CHill60

Вы не сформулировали вопрос или проблему. Пожалуйста, используйте ссылку "улучшить вопрос", чтобы добавить эту деталь в свой пост

Tra22

Могу ли я получить вашу электронную почту или телеграмму для отправки ее вам и легко dicuss?

CHill60

Нет, не можешь.

Tra22

Так что теперь ты понимаешь, что я имею в виду?

Tra22

Где я могу спросить об этом? Заранее благодарю, что объяснили мне.

CHill60

Где вы можете спросить что? Обновите свой пост здесь с реальным вопросом или объяснением вашей проблемы

Tra22

Да моя проблема просто добавьте многопоточность к моей функции как моя подпись

Gerry Schmitz

Ответ зависит от того, какая платформа: UWP; WPF; Windows forms; Net Core; Net Framework...

Tra22

Форма окна . net Framework

2 Ответов

Рейтинг:
1

Ashutosh Gpt

getsize для одновременного размещения нескольких путей используйте встроенный в c# TPL(parallel task library)

Parallel.Invoke(
            () =>
            {
                //code for getsize1
            },

            () =>
            {
                //code for getsize2
            },

            () =>
            {
                //code for getsizeN
            }

я надеюсь, что это поможет.


Tra22

Не могли бы мы использовать петлю на параллели? Призывать? Потому что функция getSize очень велика, и мы не можем знать, сколько она стоит.

Tra22

Значит, что путь к вам магазине размер в коллекции

[no name]

что-то вроде ниже
var collectionofpaths = новый список<string>();
var actions = новый список<action>();
foreach (var path в collectionofpaths)
{
действия.Add(() => getsize(path));
}

Параллель.Invoke(действия.Метод toArray());

Tra22

Я попробую это сделать.И рассказать вам об этом можно или нет.Слишком большое спасибо, братан.

Tra22

Проблема заключается в том, что функция не вычисляется по одному.Но это всего лишь весь размер функции.Пример getSize1=100GB ,getSize2=1000Gb,getSize3=10000GB, но это не так показано.Но он показывает с 11100GB(всего все функции)

[no name]

если я хорошо помню, вы сохраняете глобальную переменную "TotalSizeOfFolder", поэтому вы получаете общий размер всех. чтобы решить эту проблему, вам нужно вернуть значение размера для каждого метода getsize, тогда TPL может не работать, вы можете использовать другой вариант задачи, который запускает новый поток для каждой операции.

словарь с каждым путем и значением 0 может быть определен в начале. затем в конце вы получите размер для каждого пути.
var collectionofpaths = новый словарь<string, int="">();
List<task> tasks = новый список<task>();
foreach (var f в collectionofpaths)
{
задачи.Добавить(System.Нарезание резьбы.Задачи.Задач.Factory.StartNew(() => collectionofpaths[f.Key] = getsize(f.Key)));
}

Система.Нарезание резьбы.Задачи.Задач.WaitAll(задачи.Метод toArray());

Рейтинг:
0

Gerry Schmitz

Windows Forms имеет наименьшее количество коротких путей к нарезанию резьбы; это должно помочь:

C# Corner: многопоточность в WinForms - журнал Visual Studio[^]


Tra22

Да, братан. Но я уже пробую его, но когда я применяю его к своей функции, он не работает. Когда я получаю поток в массив и запускаю его с помощью функции с циклом. Это не работает.

Gerry Schmitz

Стараться.

CHill60

"это не работает" не помогает нам помочь вам. Вы действительно делаете эту тяжелую работу для нас

Tra22

Почему?

CHill60

Почему? Потому что вы не совсем ясно представляете себе свою проблему. Вам нужно научиться описывать проблемы точно и полно. Это тяжелая работа для нас, чтобы продолжать задавать вам вопросы и просить разъяснений. Большинство людей просто перестанут беспокоиться.
К счастью, похоже, что Ашутош теперь помогает тебе.

Tra22

Нечего сказать