メソッドを非同期で実行する場合は、通常、次のように記述します。
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
}