异步运行同步代码

本文关键字:代码 同步 运行 异步 | 更新日期: 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);
   }
}