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;