C# 等待在委托中调用的任务

C# 等待在委托中调用的任务,c#,async-await,asp.net-web-api2,C#,Async Await,Asp.net Web Api2,我有一个控制器方法,看起来像这样: [HttpPut, Route("cqs/command")] public HttpResponseMessage Command([ValueProvider(typeof(HeaderValueProviderFactory))] string typeName) { object reply = null; var code = HttpStatusCode.OK; try { var cmdObject

我有一个控制器方法,看起来像这样:

[HttpPut, Route("cqs/command")]
public HttpResponseMessage Command([ValueProvider(typeof(HeaderValueProviderFactory))] string typeName)
{
    object reply = null;
    var code = HttpStatusCode.OK;
    try
    {
        var cmdObject = DeserializeRequest(typeName);
        var method = _commandMethod.MakeGenericMethod(type);
        method.Invoke(this, new object[] { request });
    }
    catch (Exception exception)
    {
        code = HttpStatusCode.InternalServerError;
        reply = exception;
    }

    var responseMsg = new HttpResponseMessage(code);
    if (reply != null)
    {
        responseMsg.Headers.Add("X-TypeName", reply.GetType().AssemblyQualifiedName);
        var replyJson = JsonConvert.SerializeObject(reply);
        responseMsg.Content = new StringContent(replyJson, Encoding.UTF8, "application/json");
    }
    return responseMsg;
}
它调用以下方法:

private void ExecuteCommand<T>(T command) where T : Command
{
    var task = _commandBus.ExecuteAsync(command);
    task.Wait(TimeSpan.FromSeconds(10));
}
private void ExecuteCommand(T命令),其中T:command
{
var task=_commandBus.ExecuteAsync(命令);
task.Wait(TimeSpan.FromSeconds(10));
}
原因是,
\u commandBus
只有一个我需要调用的通用方法

但是问题是,
ExecuteCommand
有时似乎会死锁。我不明白为什么。
ICommandBus.ExecuteAsync
方法将使用async/await调用其他任务,因此它可能是某种死锁,因为WebApi使用同步上下文?()

因此,如果我理解正确,可能有两种解决方案:

  • 始终使用异步/等待。但是,当使用
    MethodInfo
    调用方法时,我该怎么做呢
  • 更改以使我的调用与同步上下文一起工作

  • 当涉及到两种解决方案时,我都不知所措。有人能帮忙吗?

    更改
    ExecuteCommand
    ,使其看起来像这样(我假设您的实际代码会在超时时执行某些操作):


    更改
    ExecuteCommand
    ,使其看起来像这样(我假设您的实际代码将在超时时执行某些操作):


    问题似乎不是来自于调用委托,而是来自于您正在对任务执行阻塞等待,而您应该异步等待。问题似乎不是来自于调用委托,而是来自于您正在对任务执行阻塞等待,当您应该异步等待时。这对命令执行有效。但是查询变量返回一个通用任务。处理这个问题的最佳方法是什么?
    Task
    继承自
    Task
    ,因此,如果您只想等待它,您不需要做任何其他事情。如果您需要以某种方式返回结果,我建议使用
    dynamic
    。这对命令执行有效。但是查询变量返回一个通用任务。处理这个问题的最佳方法是什么?
    Task
    继承自
    Task
    ,因此,如果您只想等待它,您不需要做任何其他事情。如果您需要以某种方式返回结果,我建议您使用
    dynamic
    private async Task ExecuteCommandAsync<T>(T command) where T : Command
    {
      var timeout = Task.Delay(TimeSpan.FromSeconds(10));
      var task = _commandBus.ExecuteAsync(command);
      await Task.WhenAny(task, timeout);
    }
    
    var task = method.Invoke(this, new object[] { request }) as Task;
    await task;