2013-10-01 2 views
0

Я не могу скомпилировать этот простой код:Асинхронный ждут ошибка компиляции на WP 7.5 Проект

XAML:

xmlns:live="clr-namespace:Microsoft.Live.Controls;assembly=Microsoft.Live.Controls" 

     <live:SignInButton 
      Name="SkydriveSignInButton" 
      ClientId="xxxxx" 
      Scopes="wl.skydrive_update wl.offline_access wl.basic wl.signin" 
      Branding="Skydrive" 
      TextType="SignIn" 
      SessionChanged="SkydriveSignInButton_OnSessionChanged" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch" 
      Grid.Row="0" 
      Grid.Column="1" 
     /> 

C#:

private void SkydriveSignInButton_OnSessionChanged(object sender, Microsoft.Live.Controls.LiveConnectSessionChangedEventArgs e) 
    { 
     if (e.Status == LiveConnectSessionStatus.Connected) 
     { 
      client = new LiveConnectClient(e.Session); 

      ListFiles(); 
     } 
     else 
     { 
      client = null; 
     } 
    } 

    public async static void ListFiles() 
    { 
     LiveOperationResult operationResultGA = await client.GetAsync("me/skydrive/files"); 
    } 

Ошибка: Не могу дождаться " void '

Проект находится в VS2010 с установленными пакетами Bcl.Async и Live 5.4

+1

Вам действительно нужно использовать VS2012 для 'async' /' await' развитие. То, что вы пытаетесь получить, - это некоторая комбинация Async CTP и Microsoft.Bcl.Async, и это не закончится хорошо ... –

+0

@StephenCleary Нет, он не будет работать на WP7, потому что библиотека не работает 't поддержка методов возврата задачи. –

ответ

0

Ну, компилятор прав - вы не awaitvoid можете: D

Вы можете только ждать Task и Task<T> типов (и те, с пользовательским awaiters), но определенно не void.

Проблемный метод GetAsync, откуда он исходит? Из Live SDK? Я не думаю, что вы можете ждать их, вам нужно создать обертку вокруг нее. Для этого у вас есть событие GetCompleted.

Также измените тип возврата для метода ListFiles от void до Task. И изменить код вызывающем абоненте:

await ListFiles(); 

Не забудьте добавить асинхронной к этому способу. Как правило, не забудьте никогда не писать async void, если это не обработчик событий. Это async на всем пути :)

+0

Спасибо за ваш ответ, я забыл указать, что код работает как есть в VS2012 в проекте WP8, я не могу позволить ему работать в WP7 ... – romeop

+0

Как я уже сказал, вы не можете «ждать», вам нужно используйте событие «GetCompleted». Вы можете создать свой собственный метод GetTaskAsync, который будет обернут событие. –

0

Пакет Live SDK не зависит от Bcl.Async, поэтому для WP7 он не может использовать Task (поддержка WP8 Task по умолчанию, поэтому для этой версии не требуется зависимость).

Вы можете легко создать свой собственный метод Task асинхронной так:

public static class MyLveExtensionAsync 
{ 
    public static Task<LiveOperationResult> GetResponseAsync(this LiveConnectClient client, string param) 
     { 
      TaskCompletionSource<LiveOperationResult> tcs=new TaskCompletionSource<LiveOperationResult>(); 
      EventHandler<LiveOperationCompletedEventArgs> handler = null; 
      handler=(sender, arg) => 
      { 
       client.GetCompleted -= handler; 
       if (arg.Cancelled) 
       { 
        tcs.TrySetCanceled(); 
       } 
       else if (arg.Error != null) 
       { 
        tcs.TrySetException(arg.Error); 
       } 
       else 
       { 
        LiveOperationResult result =new LiveOperationResult(arg.Result,arg.RawResult); 
        tcs.TrySetResult(result); 
       } 
      }; 

      client.GetCompleted += handler; 
      client.GetAsync(param); 
      return tcs.Task; 
     } 

} 

Что вы можете использовать так:

LiveOperationResult operationResultGA = await client.GetResponseAsync("me/skydrive/files"); 
Смежные вопросы