实体框架将存储过程作为DbContext类的方法导入。 但是,它们不是异步的,我希望能够从异步WebApi控制器调用它们,而不会阻塞该线程。我编写了一个异步包装器方法,但我对Visual Studio给出的警告感到困惑。
此代码是否会异步执行?
public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId)
{
await Task.Run(() =>
{
//synchronous method generated by EF.
//VS warning here
AttachTypeToMeetingTime(meetingTimeId, meetingTypeId);
});
}
Visual Studio给了我警告:
因为没有等待此调用,所以在调用完成之前继续执行当前线程
但是,如果我按照建议添加等待,则会以红色加下划线并且不会编译。
我不希望当前线程在呼叫完成之前继续吗?
答案 0 :(得分:4)
您正在进行递归通话。我不认为你是这么做的。
它应该像您所说的那样调用同步方法而不是 AttachTypeToMeetingTime 。
public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId)
{
await Task.Run(() =>
{
SomeMethod(meetingTimeId, meetingTypeId);
^^^^^
});
}
答案 1 :(得分:1)
我正在错误地调用方法名称。它应该是:
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的建议引擎和可能< / em>编译器。
答案 2 :(得分:0)
在下面的代码中填写以“你的”开头的内容。
public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId)
{
using(var context = new YourContext())
{
await conext.Database.ExecuteSqlCommandAsync("YourStoredProcedureName @YourParam1Name, @YourParam2Name", meetingTimeId, meetingTypeId);
}
}