我无法编译这个简单的代码:
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数据包
答案 0 :(得分:0)
好吧,编译器是对的 - 你不能await
void
:D
您只能等待Task
和Task<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");