Вопрос по windows-runtime, c#, async-await – Использование StorageFile Async в приложении NON Metro

8

Я пытаюсь создать экземпляр StorageFile в моей библиотеке классов ...

var localFolder = ApplicationData.Current.LocalFolder;
StorageFile destinationFile = await localFolder.CreateFileAsync(destination, CreationCollisionOption.GenerateUniqueName);

VS11 не строит, скажем: «жду»; требует, чтобы тип «Windows.Foundation.IAsyncOperation» есть подходящий метод GetAwaiter. Вы пропустили директиву об использовании системы?

очевидно, я использую .net 4.5 в качестве цели, и я ссылаюсь на сборки Windows ... не уверен, почему этот код работает в MetroStyle, но не встроен в библиотеку классов ... Как я могу создать экземпляр Storagefile в библиотеке классов ??? на данном этапе не важно, если файл создан асинхронным способом ...

Пожалуйста, дайте мне знать ваши мысли ... Stelio

В стиле Metro есть ли дополнительные операторы использования в верхней части файла кода? Adam Houldsworth
там же используют ... Stelio Di Bello

Ваш Ответ

4   ответа
8

что системное пространство имен отсутствует в заголовке пространства имен. Я просто включил систему в пространство имен, и она работала. Надеюсь, поможет.

Error: User Rate Limit Exceeded
5

StorageFile документация по классу заявляет, что это относится только к метро, и это находится вWindows.Storage.

Этот пост в блоге проходит через, как построить это, но это, кажется, ручной процесс. Это также детализирует причину ошибки:

Using the await keyword causes the compiler to look for a GetAwaiter method on this interface. Since IAsyncOperation does not define a GetAwaiter method, the compiler wants to look for an extension method.

По сути, похоже, что вам нужно добавить ссылку на:System.Runtime.WindowsRuntime.dll

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

Blog Content Below Unceremoniously Plagiarised

Сначала в Блокноте я создал следующий исходный код C # в EnumDevices.cs:

using System;
using System.Threading.Tasks;
using Windows.Devices.Enumeration;
using Windows.Foundation;

class App {
    static void Main() {
        EnumDevices().Wait();
    }

    private static async Task EnumDevices() {
        // To call DeviceInformation.FindAllAsync:
        // Reference Windows.Devices.Enumeration.winmd when building
        // Add the "using Windows.Devices.Enumeration;" directive (as shown above)
        foreach (DeviceInformation di in await DeviceInformation.FindAllAsync()) {
            Console.WriteLine(di.Name);
        }
    }
}

Во-вторых, я создал файл Build.bat, который запускаю из командной строки разработчика, чтобы построить этот код (это должна быть 1 строка, но я обертываю его здесь для возможности чтения):

csc EnumDevices.cs  
/r:c:\Windows\System32\WinMetadata\Windows.Devices.Enumeration.winmd  
/r:c:\Windows\System32\WinMetadata\Windows.Foundation.winmd 
/r:System.Runtime.WindowsRuntime.dll  
/r:System.Threading.Tasks.dll

Затем в командной строке я просто запускаю EnumDevices.exe, чтобы увидеть результат.

Error: User Rate Limit ExceededawaitError: User Rate Limit ExceededGetAwaiterError: User Rate Limit ExceededcscError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Stelio Di Bello
Error: User Rate Limit ExceedednumDevices.cs(14,35): error CS4028: 'await' requires that the type 'Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceIn formationCollection>' have a suitable GetAwaiter method. Are you missing a using directive for 'System'?
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededusing System;Error: User Rate Limit ExceededawaitError: User Rate Limit Exceeded
1

После добавления ссылок:
System.Runtime.WindowsRuntime.dll
System.Threading.Tasks.dll

и ориентация на windows 8 в файле проекта:

  <PropertyGroup>
    <TargetPlatformVersion>8.0</TargetPlatformVersion>
  </PropertyGroup>

Упомянутый выше пример может быть скомпилирован в VS.

Error: User Rate Limit Exceeded
10

<PropertyGroup>
  <TargetPlatformVersion>8.0</TargetPlatformVersion>
</PropertyGroup>

и в группе товаров добавьте следующее

<ItemGroup>
  <Reference Include="System.Runtime.WindowsRuntime" />
  <Reference Include="System.Runtime" />
  <Reference Include="Windows" />
</ItemGroup>

Тогда проект должен скомпилироваться нормально.

Error: User Rate Limit Exceeded

Похожие вопросы