2013-10-01 30 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");