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 Update」を使用する: 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

s がある場合はTask、いわゆる「継続渡しスタイル」を使用できます。基本的に、 を使用するすべての場所awaitで、代わりにメソッドの残りの部分を呼び出しTask.ContinueWithて渡します。ループはより複雑ですが、継続で処理することもできます。

GetAsyncTaskAsync CTP が正しくインストールされていないと、正しく動作しない可能性があることに注意してください。したがって、あなたのケースでは、クラスで既にサポートされているイベント ベースの非同期パターン (EAP)LiveConnectClientを使用することをお勧めします。たとえば、GetCompletedイベントをサブスクライブしてから を呼び出しますGetAsync例については、この投稿を参照してください。

于 2012-09-07T11:36:00.150 に答える
0

フレームワークの新しいバージョンでのみ使用可能なメソッドを同じコードが使用していないと仮定すると、TPL メソッドを使用して、その機能を再現することができawaitます。 awaitawait を実行したコードの同期コンテキストで継続を実行します。したがって、それを複製するには、TaskScheduler を受け入れる ContinueWith のオーバーロードを使用し、現在のコンテキストから TaskScheduler を渡す必要があります。例えば:

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 の後のコードを 2 つの異なる方法で呼び出すことができるためです。1 つは非同期です。null の場合progDataFolderは、else の後のコードが非同期的に呼び出されます。null でない場合progDataFolderは、インスタンスprogDataFolderIdから設定され、else の後のコードが同期的に関与します。progDataFolder. そのため、TPL メソッドを使用して適切にモード化する必要があります。progDataFolderつまり、 is notの場合、継続中の else の後にコードを実行することはありませんnull

于 2012-09-07T14:07:44.490 に答える