Выполнение функции в фоне
Есть проблемка, пытаюсь сделать так чтобы функция генерации отработала в фоне, т.е. пока генерируется файл у меня воспроизводится 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
}
}