参数 1:无法从 'System.Threading.Tasks.Task<Project.Models.Booking>' 转换为 Project.Models.Booking

Posted

技术标签:

【中文标题】参数 1:无法从 \'System.Threading.Tasks.Task<Project.Models.Booking>\' 转换为 Project.Models.Booking【英文标题】:Argument 1: cannot convert from 'System.Threading.Tasks.Task<Project.Models.Booking>' to Project.Models.Booking参数 1:无法从 'System.Threading.Tasks.Task<Project.Models.Booking>' 转换为 Project.Models.Booking 【发布时间】:2019-09-27 05:09:33 【问题描述】:

我正在做学校项目,我正在尝试在我的存储库类中实现异步方法,并在我的 POST 方法的 API 中收到此错误:参数 1:无法从 'System.Threading.Tasks.任务'到 Project.Models.Booking。

有人可以帮我解决这个错误吗?

这就是我的存储库方法的样子:

    public async Task<Booking>CreateBooking(Booking inBooking) 
        Booking booking = new Booking();

        booking.BookingId = ApplicationDbContext.Bookings.Count();
        booking.UserName = inBooking.UserName;
        booking.UserMail = inBooking.UserMail;
        booking.UserMobile = inBooking.UserMobile;
        booking.Available = false;
        booking.StartTime = inBooking.StartTime;
        booking.EndTime = inBooking.EndTime;
        booking.Date = inBooking.Date;

        Add(booking);
        return await Task.FromResult(booking);
        //return booking;
    

这就是我的 Post-method 的样子:

 [Route("api/PostBooking")]
        [HttpPost]
        public async Task<IHttpActionResult> PostBooking(BookingSystemServiceBookingViewModel inBooking)
        
            if (!ModelState.IsValid)
            
                return BadRequest("Invalid data");
            

            var booking =  inBooking.booking;

            booking.StartTime = inBooking.startTime;
            booking.EndTime = inBooking.startTime.AddMinutes(inBooking.service.Duration);

             uw.Services.AddBooking(uw.Bookings.CreateBooking(booking), inBooking.service.ServiceId);
            uw.Complete();

            return Ok();
        

我在以下位置收到错误消息:uw.Services.AddBooking(uw.Bookings.CreateBooking(booking), inBooking.service.ServiceId);`

【问题讨论】:

要返回Task&lt;&gt; 方法的结果,您需要await.Result uw.Services.AddBooking(await uw.Bookings.CreateBooking(booking), inBooking.service.ServiceId); 这也是我遵循在方法名称末尾添加后缀 Async 的建议的原因之一...... :) 通常的建议是在异步函数的名称后面加上“Async”。如果你这样做了,你就不太可能忘记“等待”他们,就像你在这里所做的那样。 return await Task.FromResult(booking); 中删除“await”,从public async Task&lt;Booking&gt;CreateBooking(Booking inBooking) 中删除“async”,你应该会很好。 【参考方案1】:

尝试在我的存储库类中实现异步方法

使事情异步的最佳方法不是从“外向内”。也就是说,您不想从控制器操作开始说“我怎样才能使这个异步?”。相反,您想从最低级别的 API 开始,说“这应该是异步的”(即它是基于 I/O 的),然后让异步从那里发展起来。

如果Add 确实进行了数据库插入,那么这将是第一个异步方法。然后你await你的AddAsync方法,异步从AddAsync增长到CreateBookingAsync

public async Task<Booking> CreateBookingAsync(Booking inBooking) 
  Booking booking = new Booking();

  ...

  await AddAsync(booking);
  return booking;


[Route("api/PostBooking")]
[HttpPost]
public async Task<IHttpActionResult> PostBooking(BookingSystemServiceBookingViewModel inBooking)

  ...

  uw.Services.AddBooking(await uw.Bookings.CreateBookingAsync(booking), inBooking.service.ServiceId);
  uw.Complete();

  return Ok();

另一方面,如果是 Complete 方法实际与数据库通信,那么 that 应该是异步的。在这种情况下,Add 纯粹是内存操作,Complete 是保存所有数据库更新的操作。因此,您将Complete 转换为CompleteAsync 之后,您的代码将如下所示:

public Booking CreateBooking(Booking inBooking) 
  Booking booking = new Booking();

  ...

  Add(booking);
  return booking;


[Route("api/PostBooking")]
[HttpPost]
public async Task<IHttpActionResult> PostBooking(BookingSystemServiceBookingViewModel inBooking)

  ...

  uw.Services.AddBooking(uw.Bookings.CreateBooking(booking), inBooking.service.ServiceId);
  await uw.CompleteAsync();

  return Ok();

【讨论】:

以上是关于参数 1:无法从 'System.Threading.Tasks.Task<Project.Models.Booking>' 转换为 Project.Models.Booking的主要内容,如果未能解决你的问题,请参考以下文章

无法将参数 1 从派生指针转换为基类指针引用

错误:“最佳重载方法匹配”和“参数 1:无法从 'string' 转换为 'int'”

错误 C2664:无法将参数 1 从“int”转换为“int (__cdecl *)(int)”

参数 1:无法从 'System.Collections.Generic.List' 转换为 'System.Collections.Generic.List'

错误 C2664:无法将参数 1 从“int”转换为“int []”

PROCEDURE 的参数数量不正确;预期为 1,得到 0。无法从代码中确定错误