C# 异步运行同步代码

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(() =>

实体框架将存储过程作为DbContext类上的方法导入。 但是,它们不是异步的,我希望能够从异步WebApi控制器调用它们,而不会阻塞线程。我已经编写了一个异步包装器方法,但是VisualStudio给我的警告让我感到困惑

这段代码会异步执行吗

    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异步方法有何不同
?真正的异步方法不会在线程上执行忙等待(与同步方法不同)。通常,您可能想了解异步,这是一个起点。