0

私はWindows8プログラミングを研究していて、少なくとも何らかの形で機能するようになる前に、この問題と数時間戦ってきました。この機能はなんとか機能しているようです。しかし、それは確かに見栄えが良くありません。

関数はログインを行い、ログインが成功した場合、マーチャントを更新するタスクをスピンオフする必要があります。実行は、マーチャントリストが完了するのを待つべきではありません。

トリッキーな部分は、OnPropertyChangedも起動するLoadingMerchantsプロパティであり、UIスレッドで実行する必要があります。

public async Task<bool?> LoginAsync(string username, string password)
{
    var uri = new Uri(string.Format("{0}/User/Login?userName={1}&password={2}", ServerURL, username, password));

    bool? result = await GetJsonAsync<bool?>(uri);

    if(result.HasValue && result.Value)
    {
        LoginDone = true;
        LoadingMerchants = true;
        var task = Task.Run(async () => { await LoadMerchantsAsync(); });
        var uitask = task.ContinueWith((loadtask) => { LoadingMerchants = false; }, TaskScheduler.FromCurrentSynchronizationContext());
    }

    return result; 

}

Task.Runは、新しいトレッドで実行を開始する適切な方法ですか?

必要のない余分な待機がたくさんありますか?

4

1 に答える 1

0

Task.Runスレッドプールスレッドで実行を開始する正しい方法です。しかし、あなたはそれを必要としません。

これは問題なく機能するはずです。

public async Task LoadMerchantsAndUpdateUiAsync()
{
  LoadingMerchants = true;
  await LoadMerchantsAsync();
  LoadingMerchants = false;
}

public async Task<bool?> LoginAsync(string username, string password)
{
  var uri = new Uri(string.Format("{0}/User/Login?userName={1}&password={2}", ServerURL, username, password));

  bool? result = await GetJsonAsync<bool?>(uri);
  if (result.HasValue && result.Value)
  {
    LoginDone = true;
    LoadMerchantsAndUpdateUiAsync();
  }

  return result; 
}
于 2012-08-29T15:06:02.713 に答える