Индикатор выполнения запускается только после завершения метода и публикации автономного exe - PullRequest
0 голосов
/ 11 декабря 2018

Это моя функция.Индикатор выполнения запускается только после запуска метода readFile.Read.Это нормально, но это означает, что при запуске readFile.Read мое приложение выглядит замороженным.Есть ли способ заставить его работать, когда мой метод работает?Я не могу поставить его раньше, как будто индикатор выполнения завершен, а задача не выполнена, пользователь может закрыть приложение.

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    var backgroundWorker = sender as BackgroundWorker;
    backgroundWorker.WorkerReportsProgress = true;
    var counter = FileCount / 100;
    var files = System.IO.Directory.GetFiles(Input);
    FileCount = files.Count();
    for (int i = 0; i < FileCount; i++)
    {
        readFile.Read(files[i], Dictionary, Output);
        backgroundWorker.ReportProgress(((i+1)*100)/FileCount);
    }
}

private void backgroundWorker_ProgressChanged(object sender,
    ProgressChangedEventArgs e)
{
    // Change the value of the ProgressBar to the BackgroundWorker progress.
    ProgressBar.Value = e.ProgressPercentage;
}

Кроме того, есть ли способ опубликовать мое приложение на c # без необходимостипользователь, чтобы установить это?Я нашел exe, который, кажется, работает нормально в папке отладки / выпуска, но мне действительно нужны все файлы?В Java я могу создавать автономные исполняемые файлы без необходимости установки пользователем.Могу ли я сделать это и здесь?

1 Ответ

0 голосов
/ 11 декабря 2018

Если ваша версия .Net поддерживает System.Threading.Tasks, я бы поменял метод на асинхронный.Затем вы можете использовать ключевые слова async и await, чтобы пользовательский интерфейс реагировал и обновлять ProgressBar так же, как если бы ваша программа была синхронной.Примерно так должно работать:

private async Task DoWorkAsync(string InputDirectory)
{
    var files = System.IO.Directory.GetFiles(InputDirectory);
    for (int i = 0; i < files.Length; i++)
    {
        await Task.Run(() => readFile.Read(files[i], Dictionary, Output));
        ProgressBar.Value = ((i + 1) * 100) / files.Length;
    }
}

Что касается развертывания приложения, нет, вам не нужно использовать установщик.Вам необходимо скопировать все файлы .exe и соответствующие файлы .dll на каждую клиентскую рабочую станцию.Вы также должны знать, что на ваших клиентах может быть установлена ​​неправильная версия .Net.Использование установщика значительно упрощает этот процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...