2013-10-01 35 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上工作,因爲庫不會不支持任務返回方法。 –

回答

0

那麼,編譯器是正確的 - 你不能awaitvoid:d

只能等待TaskTask<T>類型(以及自定義awaiters),但絕對不是void

有問題的方法GetAsync,它來自哪裏?從Live SDK?我不認爲你可以等待這些,你需要圍繞它建立一個包裝。你有GetCompleted事件。

另外,將ListFiles方法的返回類型從void更改爲Task。 和更改主叫代碼:

await ListFiles(); 

不要忘記添加異步到該方法。通常,除非它是一個事件處理程序,否則請記住永遠不要寫async void。它是async一路down :)

+0

感謝您的回覆,我忘記聲明WP8項目中的代碼在VS2012中的工作原理,我無法讓WP7在WP7中工作... – romeop

+0

就像我說的,你不能「等待」那些,你需要使用'GetCompleted'事件。您可以創建自己的'GetTaskAsync'方法來覆蓋事件。 –

0

Live SDK包不取決於Bcl.Async,因此對於WP7它不能使用任務(默認情況下WP8支持任務,因此沒有該版本所需的依賴項)。

您可以輕鬆地創建這樣自己的異步任務的方法:

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");