2

我正在尝试在我的应用程序中实现此代码以将数据备份到 skydrive http://netitude.bc3tech.net/2012/07/11/skydrive-backup-of-your-mobile-applets-get-some-common-ground /

但是我如何无法安装 Async CTP(我在 2-3 天内进行了测试,但 async ctp 没有安装好……我已经尝试过解决方案,但问题仍然存在)。可以做同样的事情但不使用异步吗?如何等待完成任务才能继续?

使用这些工具“Windows Phone SDK 7.1 和 7.1.1 更新”:https ://dev.windowsphone.com/en-us/downloadsdk

(...)

var rootFolders = JObject.Parse((await client.GetAsyncTask("/me/skydrive/files?filter=folders,albums")).RawResult);
var progDataFolder = rootFolders["data"].FirstOrDefault(f => f.Value<string>("name").Equals("programdata", StringComparison.OrdinalIgnoreCase));
string progDataFolderId;
if (progDataFolder == null)
{
    var result = await client.PostAsyncTask("me/skydrive/",
        new Dictionary<string, object>() { { "name", "ProgramData" } });**

    progDataFolderId = JObject.Parse(result.RawResult).Value<string>("folder_id");
}
else
{
    progDataFolderId = progDataFolder.Value<string>("id");
}

var windowsPhoneFolder = JObject.Parse((await client.GetAsyncTask(string.Concat("/", progDataFolderId, "/files?filter=folders,albums"))).RawResult)["data"]
    .FirstOrDefault(f => f.Value<string>("name").Equals("windows phone", StringComparison.OrdinalIgnoreCase));
string windowsPhoneFolderId;
if (windowsPhoneFolder == null)
{
    var result = await client.PostAsyncTask(string.Concat("/", progDataFolderId),
        new Dictionary<string, object>() { { "name", "Windows Phone" } });**

    windowsPhoneFolderId = JObject.Parse(result.RawResult).Value<string>("id");
}
else
{
    windowsPhoneFolderId = windowsPhoneFolder.Value<string>("id");
}

(...)

替代执行此操作。例子:

var result = await client.PostAsyncTask("me/skydrive/",
            new Dictionary<string, object>() { { "name", "ProgramData" } });
4

2 回答 2

0

如果你有Tasks,你可以使用所谓的“延续传递风格”。本质上,在任何你会使用的地方await,你都会调用Task.ContinueWith并传入你的方法的其余部分。循环更复杂,但也可以用延续来处理。

请注意,GetAsyncTask如果您没有正确安装异步 CTP,则可能无法正常工作。因此,在您的情况下,我建议您使用该类已经支持的基于事件的异步模式(EAP)LiveConnectClient:例如,订阅GetCompleted事件然后调用GetAsync. 有关示例,请参见这篇文章。

于 2012-09-07T11:36:00.150 回答
0

假设相同的代码不使用任何仅在新版本框架中可用的方法,您可以简单地使用 TPL 方法来重现所做的事情awaitawait使用执行 await 的代码的同步上下文运行延续。因此,要复制它,您需要使用接受 TaskScheduler 并从当前上下文传入 TaskScheduler 的 ContinueWith 重载。例如:

TaskScheduler taskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
client.PostAsyncTask("me/skydrive/", new Dictionary<string, object>() {{"name", "ProgramData"}})
    .ContinueWith(t =>
                    {
                    progDataFolderId= JObject.Parse(result.RawResult).Value<string>("folder_id");
                    });

await现在,这是使用任务调度程序将一个转换为 TPL 方法的简单部分。编译器实际上在做的是在你的async方法(包含所有await代码的方法)中创建一个状态机。该状态机已将您的原始代码分解为多个块并跟踪各种事情progDataFolder == null,例如因为在您的情况下,可以以两种不同的方式调用第一个 else 之后的代码。一种是异步的——如果progDataFolder为空,则异步调用else之后的代码,如果progDataFolder不为null,progDataFolderId则从实例中设置,并且同步progDataFolder涉及else之后的代码. 因此,您必须使用 TPL 方法正确地进行模式化。progDataFolder即当is not时,您不会在 else 之后继续运行代码null

于 2012-09-07T14:07:44.490 回答