0

だから私はいくつかの非同期メソッドを使用して Windows 8 アプリケーションに取り組んでいます。ある特定の場所では、非同期メソッドが終了するのを待つためにアプリケーションが必要ですが、状態の EventHandle を送信していないようです。

連携する必要があるメソッドは次のとおりです。

public class Film : Page

private User loggedinUser = new User();
private EventWaitHandle handle = new AutoResetEvent(false);
private dynamic parameters;

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    this.parameters = e.Parameter;
    LoadFacebookData(parameters);
    handle.WaitOne();
    LoadUserMovies(loggedinUser.UserName);

}

private async void LoadFacebookData(dynamic parameter)
{
    //async code that gets info from facebook whichs determines what user is logged in
    handle.Set();
}

private void LoadUserMovies(string username)
{
    // irrelevant code
} 

handle.WaitOne()コードがビットに当たった瞬間、完全に機能しなくなります

4

3 に答える 3

0

私が見る限り、あなたが投稿したコードに問題はありません。これは、問題がコメントアウトしたコードにあると私に信じさせます。問題はおそらく、コード実行が行に到達しないことです

handle.Set();

これは、例外が原因であるか、非同期コードが完了しないことが原因である可能性があります。例外の可能性に「対処」するには、独自の EventWaitHandle ではなく、Task オブジェクトの組み込みの Wait メソッドを使用する必要があります。

EventWaitHandle を全体として削除し、次のようにするだけです。

LoadFacebookData(parameters).Wait();

これにより、スレッド内で発生した例外が伝播されます。

于 2013-01-27T15:01:49.477 に答える
0

要するに、非同期を使用して何かを待つことは想定されていません。よくある間違いは、タスクが返されるのを待つことです (デッドロック)。これにバリエーションを加えました。イベントを作成し、それを待ちました (これもデッドロックです)。

解決策: async-await を採用するか、async をまったく行わないでください。混合スタイルで両方を行うことはできません (一般的に)。

await が利用可能な場合、これは良い出発点です:

await LoadFacebookData(parameters);

イベントを取り除きます。

于 2013-01-27T14:46:47.503 に答える
0

を使用することをお勧めします

await LoadFacebookData(parameters);

非同期操作が終了したら、開始されたのと同じスレッドで実行を継続するためのコード行。

于 2013-01-27T14:47:02.427 に答える