storagefile::ReadAsync exception in c++/cx?
c++, c++-cx, windows-8, windows-store-apps
Solution
If this code is executing on the UI thread (or in any other Single Threaded Apartment, or STA), then the calls to `.get()` will throw if the tasks have not yet completed, because the call to `.get()` would block the thread. You must not block the UI thread or any other STA, and when compiling with C++/CX support enabled, the libraries enforce this.
If you turn on first chance exception handling in the debugger (Debug -> Exceptions..., check the C++ Exceptions check box), you should see that the first exception to be thrown is an `invalid_operation` exception, from the following line in `<ppltasks.h>`:
// In order to prevent Windows Runtime STA threads from blocking the UI, calling
// task.wait() task.get() is illegal if task has not been completed.
if (!_IsCompleted() && !_IsCanceled())
{
throw invalid_operation("Illegal to wait on a task in a Windows Runtime STA");
}
The "invalid parameter" you are reporting is the fatal error that is caused when this exception reaches the ABI boundary: the debugger is notified that the application is about to terminate because this exception was unhandled.
You need to restructure your code to use continuations, using `task::then`, as described in the article Asynchronous Programming in C++ Using PPL
Problem
I have been trying to use c++/cx `StorageFile::ReadAsync()` to read a file in a store-apps, but it always return an invalid params exception no matter what ``` // "file" are returned from FileOpenPicker IRandomAccessStream^ reader = create_task(file->OpenAsync(FileAccessMode::Read)).get(); if (reader->CanRead) { BitmapImage^ b = ref new BitmapImage(); const int count = 1000000; Streams::Buffer^ bb = ref new Streams::Buffer(count); create_task(reader->ReadAsync(bb, 1, Streams::InputStreamOptions::None)).get(); } ``` I have turn on all the manifest capabilities and added "file open picker" + "file type association" for Declarations. Any ideas ? thanks! ps: most solutions I found is for C#, but the code structure are similar...