3

私は Windows 8 CP に取り組んでおり、アプリで新しい async/await メカニズムを適切に動作させることができないことを発見しました。

私が示しているこの方法は、UnitTest (単体テストから呼び出されます) として実行すると機能しますが、正常に実行すると機能しません!

StreamSocket _client;

private void Start() {
     SomeMethod();
     SomeOtherMethod();
}

private async void SomeMethod(string sample)
{
    var request = new GetSampleRequestObject(sample);
    byte[] payload = ConvertToByteArray(request, Encoding.UTF8);

    DataWriter writer = new DataWriter(_client.OutputStream);
    writer.WriteBytes(payload);
    await writer.StoreAsync(); // <--- after this executes, it exits the method and continues
    await writer.FlushAsync(); // <--- breakpoint never reaches here, instead
    writer.DetachStream();
}

private void SomeOtherMethod()
{
    string hello = "hello"; // <--- it skips everything and reaches here!
}

何を与える?

4

4 に答える 4

6

Start 関数の最初の SomeMethod 呼び出しの前に await を配置する必要があると思います。

await SomeMethod();

于 2012-03-14T15:35:00.007 に答える
2

Daniel Schlößerの答えには他の問題があると思います。これが私の改善された方法です:

private async void Start() {
    await SomeMethod();
    SomeOtherMethod();
}

非同期関数は必ず最初に「await」を付けて呼び出す必要があります。ただし、非同期関数を使用する関数も「非同期」に署名する必要があります。

それが私のポイントです。ありがとう

于 2012-09-26T03:23:56.480 に答える
1

SomeOtherMethod を呼び出す前に SomeMethod を完了させたいと思われるので、Task を返してそのタスクが完了するのを待つ必要があります。必要なのは、宣言の「async void」を「async Task」に変更し、Start メソッドで呼び出し元を SomeMethod().Wait(); に変更することだけです。

現状では、タスクが完了するのを待っているわけではないので、メソッドが終了すると (最初の await を押すと)、完了した他のものを「ブロック」するものは何もありません。

「async void」を使用すると、いつ完了するか(または、完了したとしても) 気にしないことを意味します。気にする場合は、「非同期タスク」を使用してから、それを適切に使用する必要があります。

説明に役立つかどうかはわかりませんが、この件に関して私が行ったブログ投稿を次に示します。

http://blog.sublogic.com/2012/03/06/async-lesson-2-of-n-async-void-probably-isnt-what-you-want/

于 2012-03-15T05:17:33.920 に答える
0

編集する必要があると思います:

StreamSocket _client;

private async Task Start() {
    await SomeMethod();
     SomeOtherMethod();
}

private async Task SomeMethod(string sample)
{
    var request = new GetSampleRequestObject(sample);
    byte[] payload = ConvertToByteArray(request, Encoding.UTF8);

    DataWriter writer = new DataWriter(_client.OutputStream);
    writer.WriteBytes(payload);
    await writer.StoreAsync(); // <--- after this executes, it exits the method and continues
    await writer.FlushAsync(); // <--- breakpoint never reaches here, instead
    writer.DetachStream();
}

private void SomeOtherMethod()
{
    string hello = "hello"; // <--- it skips everything and reaches here!
}

お役に立てれば幸いです

于 2013-08-23T07:11:25.293 に答える