Как читать файл асинхронно при запуске приложения?
У меня есть странная проблема с
FileStream.ReadAsync()
Я вызываю функцию, которая выполняет асинхронное чтение из потока из моего основного приложения OnStartup()
Когда я читаю асинхронно, приложение никогда не отображает свое главное окно. Если я просто изменю чтение на синхронную версию, приложение запустится.Это мой
OnStartup()
переопределение:protected override async void OnStartup( StartupEventArgs e ) { base.OnStartup( e ); Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; LogsEmailer logsEmailer = new LogsEmailer(); string testString = await logsEmailer.TestReadFileAsync( Path.Combine( logsFolder, "TestFile.txt" ) ); StartupUri = new Uri( "./View/MainWindow.xaml", UriKind.Relative ); }
Приложение никогда не запускается с этой функцией:
public async Task<string> TestReadFileAsync( string filePath ) { using( FileStream sourceStream = File.OpenRead( filePath ) ) { byte[] copyBuffer = new byte[ 4096 ]; bool doneCopying = false; while( !doneCopying ) { int numSourceBytes = await sourceStream.ReadAsync( copyBuffer, 0, copyBuffer.Length ); if( numSourceBytes == 0 ) doneCopying = true; } } return "test string"; }
Но все начинается именно с этого:
public async Task<string> TestReadFileAsync( string filePath ) { using( FileStream sourceStream = File.OpenRead( filePath ) ) { byte[] copyBuffer = new byte[ 4096 ]; bool doneCopying = false; while( !doneCopying ) { int numSourceBytes = sourceStream.Read( copyBuffer, 0, copyBuffer.Length ); if( numSourceBytes == 0 ) doneCopying = true; } } return "test string"; }
Очевидно, что я получаю предупреждение со вторым фрагментом кода, который говорит, что он будет завершен синхронно. И когда я говорю, что вторая версия работает, я имею в виду только то, что она позволяет приложению запускаться; я не могу использовать ее, потому что операция, которую я пытаюсь выполнить, занимает слишком много времени, чтобы быть выполненной синхронно.
OnStartup()
.Наверное, я упускаю здесь что-то глупое. Кто-нибудь может мне сказать, что именно?
Что я уже пробовал:
Я уже упоминал выше, я попытался удалить асинхронность из потока чтения, и приложение запускается нормально.
Я только что обнаружил, что если я изменю свой
OnStartup()
переопределение должно быть следующим, после чего приложение запускается нормально.protected override async void OnStartup( StartupEventArgs e ) { base.OnStartup( e ); Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; StartupUri = new Uri( "./View/MainWindow.xaml", UriKind.Relative ); LogsEmailer logsEmailer = new LogsEmailer(); string testString = await logEmailer.TestReadFileAsync( Path.Combine( logsFolder, "TestFile.txt" ) ); }
phil.o
Итак, с тем, что вы только что обнаружили, можете ли Вы наконец увидеть что-то входящее в вашу переменную testString (когда вы отлаживаете свое приложение и помещаете точку останова где-то в своем переопределении)?
Кстати, хороший вопрос, я его поддержал.
Patrick Skelton
Да, я получаю строковое значение, возвращаемое с обеими версиями функции, независимо от того, помещаю ли я вызов функции до или после настройки URI запуска.
BillWoodruff
Это приложение WinForm ?