C# 异步运行同步代码
实体框架将存储过程作为DbContext类上的方法导入。 但是,它们不是异步的,我希望能够从异步WebApi控制器调用它们,而不会阻塞线程。我已经编写了一个异步包装器方法,但是VisualStudio给我的警告让我感到困惑 这段代码会异步执行吗C# 异步运行同步代码,c#,entity-framework,lambda,async-await,task,C#,Entity Framework,Lambda,Async Await,Task,实体框架将存储过程作为DbContext类上的方法导入。 但是,它们不是异步的,我希望能够从异步WebApi控制器调用它们,而不会阻塞线程。我已经编写了一个异步包装器方法,但是VisualStudio给我的警告让我感到困惑 这段代码会异步执行吗 public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId) { await Task.Run(() =>
public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId)
{
await Task.Run(() =>
{
//synchronous method generated by EF.
//VS warning here
AttachTypeToMeetingTime(meetingTimeId, meetingTypeId);
});
}
Visual studio向我发出警告:
由于不等待此调用,因此当前线程的执行将在调用完成之前继续
但是,如果我遵循建议并添加wait,它将以红色下划线,并且不会编译
我不希望当前线程在调用完成之前继续吗?您正在进行递归调用。我想你不是故意的 它应该像您所说的那样调用同步方法,而不是AttachTypeToMeetingTime
public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId)
{
await Task.Run(() =>
{
SomeMethod(meetingTimeId, meetingTypeId);
^^^^^
});
}
我错误地调用了方法名。应该是:
public async Task AttachTypeToMeetingTimeAsync(int meetingTimeId,int meetingTypeId)
{
await Task.Run(() =>
{
//synchronous method generated by EF.
//VS warning here
AttachTypeToMeetingTime(meetingTimeId, meetingTypeId);
});
}
生成的方法的签名为
AttachTypeToMeetingTime(int? meetingTimeId,int? meetingTypeId)
我认为,因为我的方法的参数是
int
,而生成的方法的参数是int?
,所以签名不会冲突,但我猜这会使visual studio的建议引擎和编译器发生故障。在下面的代码中填写以“Your”开头的内容
public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId)
{
using(var context = new YourContext())
{
await conext.Database.ExecuteSqlCommandAsync("YourStoredProcedureName @YourParam1Name, @YourParam2Name", meetingTimeId, meetingTypeId);
}
}
对递归的理解很好这是一个输入错误,谢谢你理解。我编辑了这个问题。旁注:我希望您理解,您实际上试图做的事情只会降低性能-您现在将工作转移到另一个线程池线程,并支付上下文切换/线程同步的费用,而不是让线程池中的一个线程处理请求(此外,该线程也没有使用区域性/当前请求进行设置,稍后会给您带来各种乐趣)@AlexeiLevenkov抱歉,我以前看到过,我认为这是可以的。将解决部分移到了它自己的答案。我所做的与异步控制器方法和/或像
FindAsync()这样的普通EF异步方法有何不同
?真正的异步方法不会在线程上执行忙等待(与同步方法不同)。通常,您可能想了解异步,这是一个起点。