Исключение при добавлении десериализованного вывода json в файл - PullRequest
0 голосов
/ 06 июня 2018

Сценарий:

Я вызываю веб-API из консольного приложения, в котором в качестве входных данных используются изображения.Вывод в формате JSON, который я десериализовал.

static void Main()
{
    DirectoryInfo di = new DirectoryInfo(@"C:\Test\Images");
    var extensions = new[] { "*.png", "*.jpg", "*.jpeg" };     
    var files = extensions.SelectMany(ext => di.GetFiles(ext));

        foreach (FileInfo file in files)
        {
            string imageFilePath = file.FullName;
             // Execute the REST API call.
            MakeAnalysisRequest(imageFilePath);
        }        
}

static async void MakeAnalysisRequest(string imageFilePath)
{
    //logic - request response Web API
    //.....
    string contentString = await response.Content.ReadAsStringAsync();
    Console.WriteLine(JsonPrint(contentString,imageFilePath);
}

static string JsonPrint(string contentString,string imageFilePath)
{
    //sb is the json string
     dynamic obj = JsonConvert.DeserializeObject(sb.ToString());
     var anger = obj[0].faceAttributes.emotion.anger;
     var happy = obj[0].faceAttributes.emotion.happy;

        StringBuilder str = new StringBuilder();
        str.Append("Anger = " +anger);
        str.Append("Happy = "+happy);

        string path = @"C:\Users\Desktop\Face.txt";
        TextWriter tw = new StreamWriter(path, true);
        tw.WriteLine(str.ToString());
        tw.Close();

return str.ToString();
}

Проблема: Если вход представляет собой одно изображение, исключений нет.Но для нескольких файлов я получаю следующее исключение:

System.IO.IOException: «Процесс не может получить доступ к файлу« C: \ Users \ Desktop \ Face.txt », поскольку он используетсядругим процессом. '

Примечание:

Если на входе имеется 10 изображений и если исключение возникает после 2или вызывается 3 изображения, затем данные этих нескольких файлов сохраняются в файле.

1 Ответ

0 голосов
/ 06 июня 2018

Ошибка выдается, как и ожидалось, поскольку вы одновременно обращаетесь к одному и тому же файлу несколькими потоками.

1.Измените main на async и await для результата анализа.

await MakeAnalysisRequest(imageFilePath);

И измените метод MakeAnalysisRequest на

static async Task MakeAnalysisRequest(string imageFilePath)

И метод Main на

static async Task Main()

2.или Wait за результат без изменения Main

MakeAnalysisRequest(imageFilePath).Wait();

3.Вы также можете сделать метод доступен только в последовательности

private static object sync = new object();
static string JsonPrint(string contentString, string imageFilePath)
{
    lock (sync)
    {
        //DO STUFF
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...