2

私はこのような方法が欲しいです:

public async void DoSomething()
{
    DoSomethingElse();
}

しかし、AWAITがないため、同期して実行されるという警告が表示されます。それは私の意図ではありませんでした。私の意図は非同期を実行することでした。だから、私はこれを行います:

public async void DoSomething()
{
    await Task.Delay(0);
    DoSomethingElse();
}

これは機能します。しかし、これは浮気か何かですか?

4

1 に答える 1

4

メソッドを非同期で実行する場合は、通常、次のように記述します。

public Task DoSomething()
{
    return Task.Factory.StartNew( () => DoSomethingElse());
}

これにより、TPLはメソッドを(バックグラウンドスレッドで)実行するようにスケジュールし、呼び出し元がawait非同期/待機サポートを使用する必要がある場合にメソッドを呼び出すときに使用できるようにします。

現在のコードでは、実際にはこれが非同期で実行されるわけではありません。メソッドが実行されてすぐに戻りDoSomethingElse()ますが、現在実行しているのと同じ同期コンテキストで発生するようにスケジュールされます。つまり、UIスレッドでメソッドを呼び出すと、すぐに前のコードが続行され、その時点でUIがブロックされることはありません、後でコンテキストがDoSomethingElse()呼び出しを実行するときにブロックされます。

もちろん、これはDoSomethingElse()それ自体が非同期メソッドではないことを前提としています。として定義されている場合はTask DoSomethingElse()、次のように記述できます。

public async Task DoSomething()
{
    // other code as needed
    await DoSomethingElse();
    // other code as needed
}
于 2012-06-13T01:01:45.880 に答える