我一直关注这个blog by Stephen Cleary我已经在线阅读了他的大量工作和其他资源。
我发布的内容(用于初始化)但我想知道从API中轮询JSON而不锁定UI的最佳解决方案。
我遇到的信息是
Windows平台非常重视只能从拥有它们的UI线程访问UI组件。
我的应用程序有两个列表框,其中都填充了可观察的集合。列表框一包含玩家和列表框两个包含玩家统计列表。我想更新两个列表框,而listbox保留其选定的项目。
我想知道的是,在没有锁定UI的情况下,每隔10秒从json更新ViewModel最安全的方法是什么。
我是在单独的线程上运行我的轮询还是使用DispatcherTimer(如果服务器需要超过十秒的时间来响应哪个计时器最好地处理这种情况)?
public static async Task<ObservableCollection<PlayerJSON>> FetchPlayerData()
{
using (var handler = new HttpClientHandler { Credentials = new NetworkCredential { UserName = "player", Password = "pass1" } })
using (var wc = new HttpClient(handler))
{
var data = await wc.GetStringAsync(new Uri(@"https://players.json")).ConfigureAwait(false);
var DeserializeTask = await Task.Run(() => JsonConvert.DeserializeObject<ObservableCollection<PlayerJSON>>(data)).ConfigureAwait(false);
return DeserializeTask;
}
}
private ObservableCollection<NotifyTaskCompletion<PlayerJSON>> _PlayerJSON;
public ObservableCollection<NotifyTaskCompletion<PlayerJSON> PlayerJSON
{
get => _PlayerJSON;
set
{
if (_PlayerJSON != value)
{
_PlayerJSON = value;
OnPropertyChanged();
}
}
}
async Task GetPlayerJSON()
{
PlayerJSON = new NotifyTaskCompletion<PlayerJSON>(FetchPlayerData());
}
更新
async Task GetPlayerJSON()
{
while (updating)
{
// This has a gitter in the view every 20 seconds
PlayerJSON = new NotifyTaskCompletion<PlayerJSON>(FetchPlayerData());
await Task.Delay(20000); // arbitrary delay
}
}
// Invoke when the view is loaded
async public Task Initialise()
{
await GetPlayerJSON();
}