私の理解では、あなただけawait
が最終的にTask
の戻りであるasync
方法を持っている場合、あなたはasync
とawait
キーワードを削除し、ちょうどTask
を返すことができるということです。例えば例外待望のリピータータスクを返すときに、結果
:
public async Task<object> Handle(object message)
{
var result = await Task.FromResult(message);
return result;
}
は
public Task<object> Handle(object message)
{
return Task.FromResult(message);
}
しかし、このメソッドは、複数のステートメントを待つ含まれている場合に動作していないようになります。例えば
:
async Task Main()
{
// outputs: Request
var requestHandlerAwaitingResult = (Request) await new HandlerAwaitingResult().Handle(new Request());
Debug.WriteLine(requestHandlerAwaitingResult.Description);
// InvalidCastException: Unable to cast object of type 'System.Threading.Tasks.Task`1[System.Object]' to type 'Request'.
var requestHandlerReturnTask = (Request) await new HandlerReturningTask().Handle(new Request());
Debug.WriteLine(requestHandlerReturnTask.Description);
}
public class Request
{
public string Description = "Request";
}
public class HandlerAwaitingResult
{
public async Task<object> Handle(object message)
{
await Task.Delay(TimeSpan.FromSeconds(1));
var result = await Task.FromResult(message);
return result;
}
}
public class HandlerReturningTask
{
public async Task<object> Handle(object message)
{
await Task.Delay(TimeSpan.FromSeconds(1));
return Task.FromResult(message);
}
}
これが動作しない理由を誰も私を伝えることができますか?
基本的に、私はまだ私は質問を理解していない
public class HandlerReturningTask
{
public async Task<object> Handle(object message)
{
await Task.Delay(TimeSpan.FromSeconds(1));
return Task.FromResult(message);
}
}
と
public class HandlerReturningTask
{
public async Task<object> Handle(object message)
{
await Task.Delay(TimeSpan.FromSeconds(1));
return await Task.FromResult(message);
}
}
と
public class HandlerReturningTask
{
public Task<object> Handle(object message)
{
return Task.FromResult(message);
}
}
ステートマシンコンパイラが非同期メソッド用に作成することの理解に基づいて、まずはその理由を説明してください。 –
私は前のコメントに同意し、あなたが何を求めているのか理解していません。あなたが気付いているように、 'async'メソッドの' return'文は、 'Task'に 'T '型のオブジェクトを返します。あなたの 'HandlerReturningTask'では、' T'は 'object'です。そして、このオブジェクトは 'await'によってアンラップされます。したがって、 'Task 'オブジェクトを返し、 'Result'にキャストしようとします。それはなぜうまくいくのですか? 'return Task.FromResult(message);'の代わりに、単に 'return message;'だけではないでしょうか? –