2016-07-21 2 views
2

Я пишу обработчик для события Unhandled Exception, который мы вычеркиваем исключение в файл, а затем отправляем на сервер для дальнейшего анализа. Пока я хочу сохранить исключение в файл и показать его в следующем прогоне. Из обработчика я звоню функцию, которая имеет такую ​​реализацию:Написание файла асинхронно в обработчике необработанных исключений

public async Task WriteDataAsync(string filename, string data) 
{ 
    var file = await this.storageFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); 
    await FileIO.WriteTextAsync(file, data); 
} 

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

  1. В чем причина такого поведения в этом контексте. Я предполагаю, что это связано с тем, как работают методы async/await, что нормально для нормальных ситуаций, но имеет проблемы с обработкой исключений в этом контексте.
  2. Существуют ли другие решения для записи в файл асинхронно в этом контексте? У меня есть одно рабочее решение, которое заключается в том, чтобы синхронно запускать функцию запуска в этом случае.

    public void WriteDataAsync(string filename, string data) 
    { 
        var fileTask = this.storageFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting).AsTask(); 
        var writingToFileTask = FileIO.WriteTextAsync(fileTask.Result, data).AsTask(); 
        writingToFileTask.Wait(); 
    } 
    

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

+1

Не могли бы вы показать весь соответствующий код, т. Е. Обработчик событий? Возможно ли, что приложение выходит до записи данных? – svick

ответ

0

Что является причиной такого поведения в этом контексте. Я предполагаю, что это связано с тем, как работают методы async/wait.

Ваша догадка правильная. Когда мы вызываем метод await, он возвращает управление вызывающей стороне метода async. В этом контексте элемент управления, наконец, вернется в Windows Runtime. И обычно после запуска события UnhandledException, Windows Runtime прекратит приложение. Возможно, приложение прекратилось до того, как асинхронные операции завершили свою работу. И это может привести к поведению, которое вы видели.

Существуют ли другие решения для записи в файл асинхронно в этом контексте? У меня есть одно рабочее решение, которое заключается в том, чтобы синхронно запускать функцию запуска в этом случае.

Для этого сценария, как правило, нужна отсрочка для асинхронной операции, как SuspendingDeferral или BackgroundTaskDeferral. Однако такой вещи нет в событии UnhandledException. В этом случае ваше решение будет правильным, мы можем сделать эти операции синхронно, чтобы избежать этой проблемы. Вы можете обратиться к этому блогу: Strategies for Handling Errors in your Windows Store Apps для обработки необработанного исключения. Он также использует это решение.

+0

Было найдено другое решение, чем описано для проблемы, но этот ответ, который вы дали, удовлетворяет моим вопросам. –

+0

@MaxiKing Какое решение вы нашли? Мне тоже интересно. Не могли бы вы поделиться им, чтобы он помог другим? –

+1

Решение было путем помещения тела обработчика события в задачу и AutoResetEvent.Set(). В поле обработчика было введено событие AutoReset WaitOne(). –

0

Я думаю, что вы можете использовать FileMode.OpenOrCreate:

public async Task WriteDataAsync(string fileName, string data) 
    { 
     byte[] text = Encoding.Unicode.GetBytes(data); 

     using (var stream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write)) 
     { 
      await stream.WriteAsync(text, 0, text.Length); 
     }; 
    } 
Смежные вопросы