0

非同期で呼び出す必要がある Web API への呼び出しのスタックがあります。私は aysnc を使用したことがありません。

次の行に沿って、簡単なテスト コンソール プログラムを作成しました。

class Program
{
    static void Main(string[] args)
    {
        ClassOne xx = new ClassOne();
        var v1 = xx.DummyTask();
    }
}

クラスが次のように定義されている場合:

namespace GHTest.classes
{
    public class ClassOne
    {
        GitHubClient client;

        public ClassOne()
        {
           client = new GitHubClient(new ProductHeaderValue("OMHSite"));
        }

        public async Task<string> DummyTask()
        {
            Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
            task.Wait();

            var myResult = task.Result;
            return myResult.FullName;
        }
    }
}

現在、このコードは同期的に実行されるため、Visual Studio は「await」演算子を使用する必要があると述べています。await 演算子はどこに行くのですか?

さらに、次のステートメントが例外をスローする場合、タスクでそれをキャッチするにはどうすればよいですか

client.Repository.Get("openEHR", "CKM-mirror");
4

1 に答える 1

6

task.Wait();の呼び出しはtask.Result暗黙的に待機します。

を使用するように書き直したメソッドを次に示しますawait

Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
var myResult = await task;

return myResult.FullName;

on a.Resultのタイプが であるため、どちらも必要ありません。awaitTask<T>T

try例外処理に関しては、 /を(または元のコードで)catch囲む必要があります。そのとき、例外が再スローされます。これは、例外が でスローされた場合にのみ当てはまることに注意してください。理論的には、関数自体がスローする可能性があり、そこでキャッチする必要があります。awaitResultTaskGet

また、 を返しているため、呼び出し(または) のasyncどこででも例外をキャッチすることを選択できることに注意してください。awaitResult

await最後に、そうしないとタスクの結果が完了しない可能性があることを忘れないでDummyTaskください (またはResult)。

static void Main(string[] args)
{
    ClassOne xx = new ClassOne();
    var v1 = xx.DummyTask();
    var resultV1 = v1.Result; //Forces the execution of v1 by requesting its result.
}
于 2015-05-15T23:08:30.037 に答える