public async Task <LoadMoreItemsResult> LoadDataAsync(uint count, CancellationToken cancellationToken) { uint resultCount = 0; BeginLoading?.Invoke(); IAsyncEnumerable <I> items = null; cancellationToken.ThrowIfCancellationRequested(); try { items = await _Source.GetPagedItems((int)_Position, (int)_Source.OneTimeLoadCount); } catch (OperationCanceledException) { } catch (Exception ex) { Debug.WriteLine(ex.Message); } cancellationToken.ThrowIfCancellationRequested(); if (items != null) { // Task.Delay(50)は多重読み込み防止のためのおまじない // アイテム追加完了のタイミングで次の追加読み込みの判定が走るっぽいので // アイテム追加が完了するまでUIスレッドが止まっている必要があるっぽい、つまり // // 「非同期処理のことはよくわからない // // 俺たちは雰囲気で非同期処理をやっているんだ」 // await Task.WhenAll( items.ForEachAsync((item) => { this.Add(item); ++resultCount; }) , Task.Delay(50) ); _Position += resultCount; } if (resultCount == 0) { _HasMoreItems = false; } DoneLoading?.Invoke(); return(new LoadMoreItemsResult() { Count = resultCount }); }
static Scene() { Events.Scene.LoadFinish.Subscribe(data => { var eventArgs = new SceneLoadedEventArgs(data.sceneName); Loaded?.Invoke(null, eventArgs); }); Events.Scene.StartLoad.Subscribe(data => { var eventArgs = new SceneLoadedEventArgs(data.sceneName); BeginLoading?.Invoke(null, eventArgs); }); }
public async Task <LoadMoreItemsResult> LoadDataAsync(uint count, CancellationToken cancellationToken) { try { await _LoadingLock.WaitAsync(); BeginLoading?.Invoke(); uint resultCount = 0; IAsyncEnumerable <I> items = null; if (!cancellationToken.IsCancellationRequested) { try { items = await _Source.GetPagedItems((int)_Position, (int)_Source.OneTimeLoadCount); } catch (OperationCanceledException) { } catch (Exception ex) { Debug.WriteLine(ex.Message); } } if (items != null && !cancellationToken.IsCancellationRequested) { // Task.Delay(50)は多重読み込み防止のためのおまじない // アイテム追加完了のタイミングで次の追加読み込みの判定が走るっぽいので // アイテム追加が完了するまでUIスレッドが止まっている必要があるっぽい、つまり // // 「非同期処理のことはよくわからない // // 俺たちは雰囲気で非同期処理をやっているんだ」 // await Task.WhenAll(Task.Delay(50), items.ForEachAsync(async(item) => { await _UIDispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { this.Add(item); }); ++resultCount; }) ); _Position += resultCount; } if (resultCount == 0) { _HasMoreItems = false; } DoneLoading?.Invoke(); return(new LoadMoreItemsResult() { Count = resultCount }); } finally { _LoadingLock.Release(); } }
public IAsyncOperation <LoadMoreItemsResult> LoadMoreItemsAsync(uint count) { var dispatcher = Window.Current.Dispatcher; return(Task.Run(async() => { try { await _LoadingLock.WaitAsync(); await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => BeginLoading?.Invoke() ); uint resultCount = 0; List <I> resultItems = null; try { var items = await _Source.GetPagedItems((int)_Position, (int)_Source.OneTimeLoadCount); resultItems = items?.ToList(); Debug.WriteLine("読み込み完了"); } catch (Exception ex) { Debug.WriteLine(ex.Message); } if (resultItems == null || resultItems.Count == 0) { _HasMoreItems = false; } else { resultCount = (uint)resultItems.Count; _Position += resultCount; await dispatcher.RunAsync(CoreDispatcherPriority.High, () => { foreach (I item in resultItems) { this.Add(item); } }); } // 多重読み込み防止のため // リスト表示に反映されるまで // タスクの終了を遅延させる必要があります await Task.Delay(500); await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => DoneLoading?.Invoke() ); return new LoadMoreItemsResult() { Count = resultCount }; } finally { _LoadingLock.Release(); } }) .AsAsyncOperation()); }