异步运行同步代码
本文关键字:代码 同步 运行 异步 | 更新日期: 2023-09-27 17:57:05
>实体框架将存储过程作为方法导入到 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给了我警告:
由于不等待此调用,因此在调用完成之前继续执行当前线程
但是,如果我遵循建议并添加 await,它会用红色下划线下划线,无法编译。
我不希望当前线程在调用完成之前继续吗?
您正在进行递归调用。我不认为你打算那样做。
它应该像你说的那样调用一个同步方法,而不是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 的建议引擎,也许还会绊倒编译器。
在下面的代码中填写以"您的"开头的内容。
public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId)
{
using(var context = new YourContext())
{
await conext.Database.ExecuteSqlCommandAsync("YourStoredProcedureName @YourParam1Name, @YourParam2Name", meetingTimeId, meetingTypeId);
}
}