1

私は非同期に不慣れで、プログラミングのスタイルを待っています。次の問題を解決するにはどうすればよいですか。

最初に以下のコードを呼び出しています。ここでの問題は、最初の行が を入力する必要があるのを待っていることですcategoriesvm.Categorieslist。これは行われませんが、2 行目が呼び出されます。(これは await のデフォルトの動作だと思います)

categoriesvm.Categorieslist最初の行に が入力されている場合にのみ 2 行目が呼び出されるようにするにはどうすればよいですか?

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    categoriesvm.GetCategories();                 
    BookCategories.DataContext = from vm in categoriesvm.Categorieslist select vm;
}

上記のコードでは、最初の行を実行すると、Categorieslist上でアクセスしているリストの下に移動します。

public async void GetCategories()
{            
    Categorieslist = new ObservableCollection<Categories>(await PhoneClient.GetDefaultCategories());          
}

phoneclient以下です

public class PhoneClient
{   
    private static readonly HttpClient client;

    public static Uri ServerBaseUri
    {
        get { return new Uri("http://169.254.80.80:30134/api/"); }
    }

    static PhoneClient()
    {        
       client =new HttpClient();
       client.MaxResponseContentBufferSize = 256000;
       client.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
    }      

    public async static Task<List<Categories>> GetDefaultCategories()
    {      
        HttpResponseMessage getresponse = await client.GetAsync(ServerBaseUri + "Categoryss");                      
        string json = await getresponse.Content.ReadAsStringAsync();         
        json = json.Replace("<br>", Environment.NewLine);
        var categories = JsonConvert.DeserializeObject<List<Categories>>(json);
        return categories.ToList();
    }
}
4

1 に答える 1

7

避けるべきasync voidです。このガイドラインについては、MSDN の記事で説明しています。

async voidメソッドを次のように変更したらasync Task

public async Task GetCategoriesAsync()
{            
  Categorieslist = new ObservableCollection<Categories>(await PhoneClient.GetDefaultCategories());          
}

次に、次のようにできますawait

protected override async void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
  await categoriesvm.GetCategoriesAsync();                 
  BookCategories.DataContext = from vm in categoriesvm.Categorieslist select vm;
}

ただし、UI イベントの外部ですべての VM 初期化を行うことをお勧めします。これにより、コードのテストが容易になります。アイデアについては、asyncコンストラクターのブログ投稿をご覧ください。

于 2013-10-23T11:45:14.350 に答える