Выполнение функции в фоне

Есть проблемка, пытаюсь сделать так чтобы функция генерации отработала в фоне, т.е. пока генерируется файл у меня воспроизводится gif, как мне можно поступить для решения данной проблема. Функция генерации - GeneratingFile.

private void GenerateFile_Click(object sender, RoutedEventArgs e)
{
    if (CheckFields() == true)
    {
        var task = GeneratingFile();
    }
    else if (CheckFields() == false)
        MessageBox.Show("Введите имя выходного файла и разделитель!", "Проверка заполнения", MessageBoxButton.OK, MessageBoxImage.Warning);
}
private void GeneratingFile()
{
    GenerateFile.IsEnabled = false;
    Loading.Visibility = Visibility.Visible;
            
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();

    using (StreamWriter file = new StreamWriter(FileName.Text + ".csv"))
    {
        char symbol = GetSymbol();
        file.WriteLine(String.Format("book_id{0}book_author{0}book_name{0}book_pages{0}book_year", symbol));

        int stringCount = 1;
                
        while (stringCount < 100000)
        {
            Random pages = new Random();
            Random year = new Random();
                    
            string bookAuthor = Faker.Name.FullName(), bookName = Faker.Company.Name();
            string bookPages = pages.Next(0, 1000).ToString(), bookYear = year.Next(1970, 2023).ToString();
            file.WriteLine(String.Format("{1}{0}{2}{0}{3}{0}{4}{0}{5}", symbol, stringCount, bookAuthor, bookName, bookPages, bookYear));
            stringCount++;
        }
        file.Close();
                
        stopwatch.Stop();
                
        MessageBox.Show("Успешно! Сгенерировано 100000 уникальных строк. \nЗатраченное время: " + stopwatch.Elapsed.ToString("G") + "\n\nРасположение файла: " + Directory.GetCurrentDirectory() + @"\" + FileName.Text + ".csv");
        GenerateFile.IsEnabled = true;
        Loading.Visibility = Visibility.Hidden;
    }
}

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

Автор решения: Виктор

Вариант запуска:

private async void GenerateFile_Click(object sender, RoutedEventArgs e)
{
    if (CheckFields() == true)
    {
        var task = await Task.Run(() => GeneratingFile());
    }
    else
        MessageBox.Show("Введите имя выходного файла и разделитель!", "Проверка заполнения", MessageBoxButton.OK, MessageBoxImage.Warning);
}
→ Ссылка
Автор решения: aepot

Файловое API содержит асинхронные методы, здесь можно использовать StreamWriter.WriteLineAsync().

Убрал из кода лишнее, например вы создавали 200000 экземпляров класса Random, в то время, когда достаточно одного. Файл закрывать .Close() тоже не следует, когда уже есть using.

private async void GenerateFile_Click(object sender, RoutedEventArgs e)
{
    try
    {
        if (CheckFields())
            await GenerateFileAsync();
        else
            MessageBox.Show("Введите имя выходного файла и разделитель!", "Проверка заполнения", MessageBoxButton.OK, MessageBoxImage.Warning);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, ex.GetType().Name);
    }
}

private async Task GenerateFileAsync()
{
    GenerateFile.IsEnabled = false;
    Loading.Visibility = Visibility.Visible;
    try
    {
        Stopwatch stopwatch = Stopwatch.StartNew();
        string fileName = FileName.Text + ".csv";
        string path = Path.Combine(Directory.GetCurrentDirectory(), fileName);
        Random rnd = new Random();

        using (StreamWriter file = new StreamWriter(path))
        {
            char symbol = GetSymbol();
            await file.WriteLineAsync(string.Format("book_id{0}book_author{0}book_name{0}book_pages{0}book_year", symbol));

            int stringCount = 1;
                
            while (stringCount < 100000)
            {
                string bookAuthor = Faker.Name.FullName();
                string bookName = Faker.Company.Name();
                string bookPages = rnd.Next(0, 1000).ToString();
                string bookYear = rnd.Next(1970, 2023).ToString();
                await file.WriteLineAsync(string.Join(symbol, stringCount, bookAuthor, bookName, bookPages, bookYear));
                stringCount++;
            }                
        }

        stopwatch.Stop();
        MessageBox.Show("Успешно! Сгенерировано 100000 уникальных строк. \nЗатраченное время: " + stopwatch.Elapsed.ToString("G") + "\n\nРасположение файла: " + path);
    }
    finally // это нужно, чтобы интерфейс гарантированно разблокировался, если будет исключение
    {
        GenerateFile.IsEnabled = true;
        Loading.Visibility = Visibility.Hidden; // лучше использовать Collapsed
    }
}
→ Ссылка