C# 对Json API中的变量进行更新检查

C# 对Json API中的变量进行更新检查,c#,uwp,C#,Uwp,因此,我有一个UWP项目,负责处理一组房间的预订。 我从一个jsonapi获取所有的值 我想做一个循环,检查房间是否每分钟都有人预订,但我不知道怎么做 这就是我如何获得所有带有预订和所有属性的房间的方法: public async void addroom() { string url = "https://api.booking.com/api/company/07ce8f7c-f3d3-4df2-84bd-33f8fc263deb/rooms";

因此,我有一个
UWP
项目,负责处理一组房间的预订。 我从一个
jsonapi
获取所有的值

我想做一个
循环
,检查房间是否每分钟都有人预订,但我不知道怎么做

这就是我如何获得所有带有预订和所有属性的房间的方法:

public async void addroom()
        {
            string url = "https://api.booking.com/api/company/07ce8f7c-f3d3-4df2-84bd-33f8fc263deb/rooms";
            HttpClient client = new HttpClient();
            string response = await client.GetStringAsync(url);
            List<Class2> data = JsonConvert.DeserializeObject<List<Class2>>(response);

            foreach (Class2 room in data)
            {
                string booking = $"https://api.booking.com/api/company/07ce8f7c-f3d3-4df2-84bd-33f8fc263deb/rooms/{room.id}/bookings";
                HttpClient BookingClient = new HttpClient();
                string BookingResponse = await BookingClient.GetStringAsync(booking);
                List<Bookings> bookings = JsonConvert.DeserializeObject<List<Bookings>>(BookingResponse);
                room.Bookings = bookings;

                string id = room.id;
                string name = room.name;
                int seats = room.seats;
                Uri Img = room.ImageUrl;
                List<Roomattribute> roomattrib = room.roomAttributes;

                var NewRoom = new Room
                {
                    RoomID = id,
                    RoomName = name,
                    FrontImage = Img,
                    Seats = seats,
                };

                 foreach (var books in bookings)
                {
                    string note = books.note;
                    DateTime TimeFrom = books.timeFrom;
                    DateTime TimeTo = books.timeTo;
                    Class2 BookRoom = books.room;
                    string BookId = books.id;

                    DateTime Now = new DateTime(2018, 04, 25, 09, 40, 00);

                    var BeforeEnd = books.timeTo.Subtract(Now).Subtract(TimeSpan.FromMinutes(15));
                    var BeforeBegin = books.timeFrom.Subtract(Now).Subtract(TimeSpan.FromMinutes(15));

                    if (books.timeFrom <= Now && books.timeTo > Now)
                    {
                        ToRed();
                        DispatcherTimer ColorTimer = new DispatcherTimer();
                        ColorTimer.Interval = BeforeEnd;
                        ColorTimer.Tick += (sender, args) =>
                        {
                            ToYellow();
                            ColorTimer.Stop();
                        };
                        ColorTimer.Start();
                    }

                    else if (books.timeTo == Now)
                    {
                        ToGreen();
                    }

                    else
                    {
                        DispatcherTimer ColorTimer = new DispatcherTimer();
                        ColorTimer.Interval = BeforeBegin;
                        ColorTimer.Tick += (sender, args) =>
                        {
                            ToYellow();
                            ColorTimer.Stop();
                        };
                        ColorTimer.Start();
                    }
                }

                foreach (var attri in roomattrib)
                {
                    int attriId = attri.id;
                    string attriName = attri.name;
                    int attriIcon = attri.icon;

                    if (room.roomAttributes.Any(a => a.id == 1))
                    {
                        NewRoom.Tv = Visibility.Visible;
                    }
                    else if (room.roomAttributes.Any(a => a.id != 1))
                    {
                        NewRoom.Tv = Visibility.Collapsed;
                    }

                    if (room.roomAttributes.Any(a => a.id == 2))
                    {
                        NewRoom.Wifi = Visibility.Visible;
                    }
                    else if (room.roomAttributes.Any(a => a.id != 2))
                    {
                        NewRoom.Wifi = Visibility.Collapsed;
                    }

                    if (room.roomAttributes.Any(a => a.id == 3))
                    {
                        NewRoom.Projector = Visibility.Visible;
                    }
                    else if (room.roomAttributes.Any(a => a.id != 3))
                    {
                        NewRoom.Projector = Visibility.Collapsed;
                    }

                    if (room.roomAttributes.Any(a => a.id == 4))
                    {
                        NewRoom.Wboard = Visibility.Visible;
                    }
                    else if (room.roomAttributes.Any(a => a.id != 4))
                    {
                        NewRoom.Wboard = Visibility.Collapsed;
                    }

                }

                Rooms.Add(NewRoom);
            }
        }
我希望我对这个问题描述得足够好,并且会很高兴在我的问题上得到一些帮助


提前谢谢

不必为每个预订分别创建一个
Dispatchermer
,您只需创建一个每时间间隔触发一次的Dispatchermer,例如每分钟触发一次(取决于您希望看到颜色变化的频率)

勾选
处理程序中,您可以检查每个房间:

  • 预订处于活动状态:红色-此检查可通过简单的
    foreach
    循环指定房间的预订来完成
  • 预订在不到15分钟内开始:黄色-再次进行一个简单的
    foreach
    循环,检查所有预订的开始时间,如果一个预订距离我们不到15分钟,我们有一个匹配
  • 否则:绿色

不必为每个预订分别创建一个
Dispatchermer
,您只需创建一个每时间间隔触发一次的Dispatchermer,例如每分钟触发一次(取决于您希望看到颜色变化的频率)

勾选
处理程序中,您可以检查每个房间:

  • 预订处于活动状态:红色-此检查可通过简单的
    foreach
    循环指定房间的预订来完成
  • 预订在不到15分钟内开始:黄色-再次进行一个简单的
    foreach
    循环,检查所有预订的开始时间,如果一个预订距离我们不到15分钟,我们有一个匹配
  • 否则:绿色
事件在间隔中指定的时间过后触发勾选以相同的间隔继续触发,直到调用停止方法、应用程序终止或应用程序挂起(触发挂起)。因此,您可以将循环放在这里,并指定内部时间为一分钟

此外,如果你想让你的应用程序在最小化或锁定屏幕下运行,你可以使用扩展执行来实现它。参见主题

---更新---

您可以看到该方法。

事件在间隔中指定的时间过后激发勾选以相同的间隔继续触发,直到调用停止方法、应用程序终止或应用程序挂起(触发挂起)。因此,您可以将循环放在这里,并指定内部时间为一分钟

此外,如果你想让你的应用程序在最小化或锁定屏幕下运行,你可以使用扩展执行来实现它。参见主题

---更新---


您可以查看方法。

谢谢您的回答!我明白你的意思,但我真的不明白把这些
foreach
循环放在哪里。。。真正的问题是如何写支票:)谢谢你的回答!我明白你的意思,但我真的不明白把这些
foreach
循环放在哪里。。。而真正的问题是如何写支票:)正如@Martin Zikmund所说,只需创建一个
Dispatchermer
并设置一个间隔(这是循环信息的速率)来触发此计时器的
Tick
事件,然后您应该能够循环预订信息并更改Tick事件中的xaml显示。你试过了吗?是的,我试过了,但是我怎样才能得到一个无限循环呢?因为它应该每分钟检查一切:)@BreezeLiu msft正如@Martin Zikmund所说,只需创建一个
dispatchermer
并设置一个间隔(这是循环信息的速率)来触发此计时器的
滴答事件,然后您应该能够循环预订信息并更改滴答事件中的xaml显示。你试过了吗?是的,我试过了,但是我怎样才能得到一个无限循环呢?因为它应该每分钟检查一次:)@BreezeLiu MSFTok,那么你的意思是我只需要在其中创建一个函数和一个异步计时器,不停止,并将间隔设置为1分钟,它应该永远循环?:)是的,如果您的应用程序没有终止或挂起,而您没有调用stop方法,则勾号事件将循环。根据我的测试,计时器与UI线程在同一线程上运行,您可以再次从服务器获取预订数据,然后在勾号事件处理程序中更改房间颜色。我将在我的回复更新部分中提供代码。好的,所以解决方案可以调用我用来获取所有数据的方法?:)如果您的服务器可以向您提供更改的项目数据,那么最好只获取更改的项目数据,然后更改其房间颜色。但如果不是,调用用于获取所有数据的方法也是一个解决方案。好的,那么你的意思是我只需要在其中创建一个函数和一个异步计时器,不停止,并将间隔设置为1分钟,它应该永远循环?:)是的,如果您的应用程序没有终止或挂起,而您没有调用stop方法,则勾号事件将循环。根据我的测试,计时器与UI线程在同一线程上运行,您可以再次从服务器获取预订数据,然后在勾号事件处理程序中更改房间颜色。我将在我的回复更新部分中提供代码。好的,所以解决方案可以调用我用来获取所有数据的方法?:)如果您的服务器可以向您提供更改的项目数据,那么最好只获取更改的项目数据,然后更改其房间颜色。但如果不是,调用用于获取所有数据的方法也是一个解决方案。
var BeforeEnd = books.timeTo.Subtract(Now).Subtract(TimeSpan.FromMinutes(15));
var BeforeBegin = books.timeFrom.Subtract(Now).Subtract(TimeSpan.FromMinutes(15));

if (books.timeFrom <= Now && books.timeTo > Now)
{
     ToRed();
     DispatcherTimer ColorTimer = new DispatcherTimer();
     ColorTimer.Interval = BeforeEnd;
     ColorTimer.Tick += (sender, args) =>
     {
         ToYellow();
         ColorTimer.Stop();
     };
     ColorTimer.Start();
 }

 else if (books.timeTo == Now)
 {
     ToGreen();
 }

 else
 {
     DispatcherTimer ColorTimer = new DispatcherTimer();
     ColorTimer.Interval = BeforeBegin;
     ColorTimer.Tick += (sender, args) =>
     {
          ToYellow();
          ColorTimer.Stop();
     };
     ColorTimer.Start();
  }
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    //Get current managed thread ID
    Debug.WriteLine(Environment.CurrentManagedThreadId);
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromMinutes(1);
    timer.Tick += async (ob, arg) =>
    {
        Debug.WriteLine(Environment.CurrentManagedThreadId);
    //You can update the booking room color here
    //TODO get data and update room color

    //You can also update the booking room color using Dispatcher.RunAsync method. 
    //This is alternative to update the data on the Tick event above TODO part directly .

        //await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        //{
        //    Debug.WriteLine(Environment.CurrentManagedThreadId);
        //    //TODO get data and update room color
        //});
    };
    timer.Start();
}