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分钟内开始:黄色-再次进行一个简单的
循环,检查所有预订的开始时间,如果一个预订距离我们不到15分钟,我们有一个匹配foreach
- 否则:绿色
Dispatchermer
,您只需创建一个每时间间隔触发一次的Dispatchermer,例如每分钟触发一次(取决于您希望看到颜色变化的频率)
在勾选
处理程序中,您可以检查每个房间:
- 预订处于活动状态:红色-此检查可通过简单的
循环指定房间的预订来完成foreach
- 预订在不到15分钟内开始:黄色-再次进行一个简单的
循环,检查所有预订的开始时间,如果一个预订距离我们不到15分钟,我们有一个匹配foreach
- 否则:绿色
您可以查看方法。谢谢您的回答!我明白你的意思,但我真的不明白把这些
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();
}