异步运行同步代码

时间:2016-07-14 23:26:56

标签: c# entity-framework lambda async-await task

实体框架将存储过程作为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给了我警告:

  

因为没有等待此调用,所以在调用完成之前继续执行当前线程

但是,如果我按照建议添加等待,则会以红色加下划线并且不会编译。

我不希望当前线程在呼叫完成之前继续吗?

3 个答案:

答案 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);
   }
}