2

私のコードブロック:

Dispatcher.BeginInvoke(() => {
            var Users = GetUsers().Result;
            // proceed...
        }

private Task<List<User>> GetUsers()
{   
    var tcs = new TaskCompletionSource<List<User>>();
    wbclient.DownloadStringCompleted += (o, e) => {
                if (e.Error == null)
                    tcs.SetResult(JsonConvert.DeserializeObject<List<User>>(e.Result));
                else
                    tcs.TrySetException(e.Error);
                };
    wbclient.DownloadStringAsync(someUri);
    return tcs.Task;
}

先に進む前に、すべてのユーザーを取得したいと考えています。だから私はGetUserディスパッチャーでメソッドを呼び出しています。DownloadStringCompletedイベントが発生するまで待ってから戻りたいだけです。しかし、上記のコードでは UI がフリーズします。どんな助けでも大歓迎です。

ノート:

windows-phone 7サポートしていないを使用していますasync await

4

2 に答える 2

3

継続を使用し、Dispatcher.BeginInvoke 呼び出しと、.Resultブロックしているメイン スレッドの呼び出しを削除する必要があります。

GetUsers().ContinueWith(t => 
{
    List<User> users = t.Result;
    this.TextBlock1.Text = "Complete"; 
}, TaskScheduler.FromCurrentSynchronizationContext());

TaskScheduler.FromCurrentSynchronizationContext()継続で呼び出しを使用して、この継続がメイン UI スレッドでマーシャリングされるようにしたことに注目してください。

于 2013-06-22T10:23:21.650 に答える
1

Windows Phone 7 で async await を使用できます。ソリューション内のすべてのプロジェクトにこの nuget パケットをインストールするだけです。一部のプロジェクトが Windows Phone 8 と共有されている場合や、一部のプロジェクトがポータブル クラス ライブラリである場合でも、完全に機能します。非常に役立ちます。

したがって、次を使用できるはずです。var Users = await GetUsers();

ところで、いつでも WebClient の代わりに HttpClient を使用できます: http://nuget.org/packages/Microsoft.Net.Http/2.1.10

于 2013-06-22T11:04:46.797 に答える