Пользовательский интерфейс зависает при попытке обновить ToolStripStatusLabel.Text из асинхронного метода с помощью IProC#

Место общения программистов C#
Ответить
Anonymous
 Пользовательский интерфейс зависает при попытке обновить ToolStripStatusLabel.Text из асинхронного метода с помощью IPro

Сообщение Anonymous »

В моем приложении я передаю параметры обработки асинхронному методу, который загружает файл с диска. Я использую асинхронный метод, чтобы иметь возможность использовать пользовательский интерфейс во время загрузки файла и избежать зависания пользовательского интерфейса. В StatusBar я использую ToolStripProgressBar и ToolStripStatusLabel, чтобы информировать пользователя о ходе различных процессов. В частности о ходе загрузки файла.
Среди других параметров, передаваемых в асинхронный метод (который загружает файл и преобразует его в DataTable), есть:

Код: Выделить всё

IProgress ProgressString = new Progress(text => toolStripStatusLabel1.Text = text);
IProgress ProgressValue = new Progress(f => toolStripProgressBar1.Value = f);
Метод вызывается следующим образом:

Код: Выделить всё

DataTable dt = await Task.Run(() => ReadFile(FileName, ProgressString, ProgressValue));
Это соответствующий раздел вызываемого метода:

Код: Выделить всё

public static DataTable ReadCSVNew(string FileName, IProgress ProgressString, IProgress ProgressValue)
{
DataTable resultingDT = CreateBaseTable();

int i = 1;

StreamReader myReader = new StreamReader(FileName, Encoding.UTF8);

var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = true
};

CsvReader csv = new CsvReader(myReader, csvConfig);

// read CSV file
var records = csv.GetRecords();

foreach (var columns in records)
{
ProgressString.Report((i++).ToString());
ProgressValue.Report(i++);
}
}
В асинхронном методе я использую ProgressValue.Report(i) в цикле foreach для обновления значения ToolStripProgressBar в строке состояния WinForm, и он работает должным образом.
Но когда я пытаюсь вместо этого использовать ProgressString.Report((i++).ToString()) в том же цикле, это не работает. Пользовательский интерфейс просто зависает, пока поток не завершится, а текстtoolStripStatusLabel не изменится.
Не могу найти ничего по этой проблеме в Интернете. Поэтому мне интересно, в чем может быть основная причина проблемы.

Подробнее здесь: https://stackoverflow.com/questions/791 ... method-usi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»