异步等待WP 7.5项目的编译错误

时间:2013-10-01 13:05:03

标签: c# windows-phone-7 async-await

我无法编译这个简单的代码:

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

错误是:无法等待'无效'

该项目在VS2010中安装了Bcl.Async和Live 5.4数据包

2 个答案:

答案 0 :(得分:0)

好吧,编译器是对的 - 你不能await void:D

您只能等待TaskTask<T>类型(以及有自定义等待者的类型),但绝对不是void

有问题的方法GetAsync,它来自哪里?从Live SDK?我不认为你可以等待那些,你需要围绕它构建一个包装器。你有GetCompleted事件。

另外,将ListFiles方法的返回类型从void更改为Task。 并将调用者代码更改为:

await ListFiles();

不要忘记将async添加到该方法中。作为一项规则,请记住永远不要写async void,除非它是一个事件处理程序。这是async一直向下:)

答案 1 :(得分:0)

Live SDK包不依赖于Bcl.Async,因此对于WP7,它不能使用Task(默认情况下WP8支持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");