Как я могу узнать, когда текущий процесс выполняется с помощью операции ввода-вывода, в частности диаграммы. SaveImage? - PullRequest
0 голосов
/ 19 сентября 2019

В своем консольном приложении я создаю диаграмму с помощью класса System.Windows.Forms.DataVisualization.Charting.Chart.Я могу создать диаграмму из моих данных и сохранить изображение с помощью этого вызова:

chart.SaveImage(chartImagePath, ChartImageFormat.Png);

Большинство онлайн-уроков посвящено сохранению изображения, которое я выполнил.Проблема возникает, когда я пытаюсь использовать это изображение, которое было только что создано.Я хочу сохранить его в списке вложений, поэтому я вызываю эту функцию:

internal static Attachment GetAttachment(string chartImagePath, string contentName)
{
    var attachment = new Attachment(chartImagePath);
    attachment.ContentDisposition.Inline = true;
    attachment.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
    attachment.ContentId = contentName;
    attachment.ContentType.MediaType = "image/png";
    attachment.ContentType.Name = Path.GetFileName(chartImagePath);
    return attachment;
}

Сбой вызова этой функции с IOException: процесс не может получить доступ к файлу «имя файла», поскольку он используетсядругой процесс.

Я попробовал пару вещей: (1) проверка File.Exists (chartImagePath) перед продолжением, но это не помогает, потому что файл существует сразу после создания, но процессеще не выпустили его (2) с использованием шаблона повторения, чтобы проглотить исключения, 3 повторных попыток было недостаточно.

Я не могу найти какую-либо документацию о том, когда завершение chart.SaveImage или если есть функция, которую я могу вызвать асинхроннопосле этого вызов завершается.Как я могу исправить эту проблему?

1 Ответ

0 голосов
/ 19 сентября 2019

Эта ошибка просто означает, что какой-то процесс все еще выполняется в файле или с файлом.После сохранения будет иметь смысл вызвать dispose на объекте диаграммы.

 var chart=new Chart(); // creating and plotting chart.
 chart.SaveImage("image.png", ChartImageFormat.Png);
 chart.Dispose();      // Release all resources that has to do with the image.

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

var stream = File.Open("image.png",FileMode.Open);
Console.WriteLine(stream.Length); // Output: 1068.
...