社区。感谢您阅读我的文章。 我在使用.NET中的api时遇到一些问题。 这个API有3个服务。 “ PushNotifications”,“注册”,“ PushNotificationRegistration
班级:
public class Subscription
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string ClientId { get; set; }
[StringLength(1000)]
public string Token { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime LastUpdateDate { get; set; }
public bool IsDeleted { get; set; }
[Index("IX_Device_App", 2, IsUnique = true)]
[ForeignKey("device")]
public string DeviceId { get; set; }
public virtual Device device { get; set; }
[Index("IX_Device_App", 1, IsUnique = true)]
[ForeignKey("app")]
public int AppId { get; set; }
public virtual App app { get; set; }
}
public class App
{
public App()
{
this.Subscriptions = new HashSet<Subscription>();
}
[Key]
public int AppId { get; set; }
public string Name { get; set; }
[JsonIgnore]
public virtual ICollection<Subscription> Subscriptions { get; set; }
}
public class Device
{
public Device()
{
this.Subscriptions = new HashSet<Subscription>();
}
/// <summary>
/// De esta forma utilizo una Key String
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Index(IsUnique = true)]
[Column(TypeName = "nvarchar")]
[StringLength(200)]
public string DeviceId { get; set; }
public string Name { get; set; }
public bool IsDeleted { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime LastUpdateDate { get; set; }
[JsonIgnore]
public virtual ICollection<Subscription> Subscriptions { get; set; }
}
方法签名
public async Task<Crosslayer.GenericReturnValue> Register(Crosslayer.Entities.Dtos.SubscriptionDto request)
public async Task<Crosslayer.GenericReturnValue> PushNotificationRegistration(Crosslayer.Entities.Olds.Subscriptions subscription)
所有方法都是Asyncronus。我有两个问题:
1) 找到订阅时,我获得了订阅和应用程序的完整数据,但有时设备数据无法恢复。我刚刚在解决此问题的查询中添加了“加入”,但有时无法恢复设备数据。我添加了(if)以恢复设备数据(如果为空)则可以在短时间内修复
Subscription DbSubscription = await (from s in context.Subscriptions
join app in context.App on s.AppId equals app.AppId
join dev in context.Device on s.DeviceId equals dev.DeviceId
where s.DeviceId == subscription.device.DeviceId &&
s.AppId == subscription.app.AppId
select s).FirstOrDefaultAsync();
foreach (var item in aux)
{
///If for Fix Device return Null
if (item.device == null)
{
item.device = await (from d in context.Device
where d.DeviceId == item.DeviceId
select d).FirstOrDefaultAsync();
}
2) 并非每次都这样,但是有时候,我得到了一个无法控制它的异常。所有方法都是异步的,并且上下文调用方带有Await。
System.NotSupportedException:在先前的异步操作完成之前,第二个操作在此上下文上启动。使用“ await”来确保在此上下文上调用另一个方法之前,所有异步操作都已完成。不保证任何实例成员都是线程安全的。 zh_cn System.Data.Entity.Internal.ThrowingMonitor.EnsureNotEntered()zh_cn System.Data.Entity.Core.Objects.ObjectQuery
1.System.Data.Entity.Infrastructure.IDbAsyncEnumerable<T>.GetAsyncEnumerator() en System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions.ForEachAsync[T](IDbAsyncEnumerable
1源,操作1 action, CancellationToken cancellationToken) en System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions.ToListAsync[T](IDbAsyncEnumerable
1源,CancellationToken cancelledToken)en System.Data .Entity.Infrastructure.IDbAsyncEnumerableExtensions.ToListAsync [T](IDbAsyncEnumerable`1源)zh_cn PushNotification_NewProject.Controllers.PushNotificationController.d__8.MoveNext()zh_cn:######### \ Controllers \ PushNotificationController.cs:lneanea 760
答案 0 :(得分:0)
当您在代码中调用Register或PushNotificationRegistration函数时,检查是否正在使用await。
或者在使用这两个函数的地方给出c#代码。