アプリケーションでpaulcbetts/refitとakavache/Akavacheを使用したい。
問題は、私の論理によれば、Windows Phone は私が次のことをするのを好まないということです:
学期を取得し (キャッシュからフェッチしてから)、必要な学期を選択し (テスト用に H2014 を配置しました)、選択した (多くの) 学期のスケジュールを取得します (キャッシュから取得してから、次のように実行します)。
var defer = Observable.Defer(() =>
BlobCache.Secure.GetAndFetchLatest("Semesters", () => _api.GetSemesters())
.Select(x => x.Single(semester => semester.AbredgedName == "H2014"))
.SelectMany(currentSemester => BlobCache.Secure.GetAndFetchLatest("Schedule_" + currentSemester.AbredgedName,
() => _api.GetSchedule(currentSemester.AbredgedName)))
);
defer.Subscribe(scheduleVms => {
foreach (var activity in scheduleVms)
{
Debug.WriteLine("1 {0}", activity.Name);
}
});
Observable.Timer(TimeSpan.FromSeconds(4)).Subscribe(_ =>
{
defer.Subscribe(scheduleVms => {
foreach (var activity in scheduleVms)
{
Debug.WriteLine("2 {0}", activity.Name);
}
});
});
5 以上の TimeSpan.FromSeconds を使用すると、まるで Windows Phone に息を吹き込む時間を与えるかのように、思いどおりに動作します。そうでなければ(5未満)、例外として得られるのは次のとおりです。
例外がスローされました: mscorlib.ni.dll StackTrace の 'System.NotSupportedException':
at MS.Internal.Modern.InternalNetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
at System.IO.Stream.<BeginEndReadAsync>b__d(Stream stream, ReadWriteParameters args, AsyncCallback callback, Object state)
at System.Threading.Tasks.TaskFactory`1.FromAsyncTrim[TInstance,TArgs](TInstance thisRef, TArgs args, Func`5 beginMethod, Func`3 endMethod)
at System.IO.Stream.BeginEndReadAsync(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.Stream.ReadAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
at System.Net.Http.DelegatingStream.ReadAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
at System.Net.Http.DelegatingStream.ReadAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
at System.IO.Stream.<CopyToAsyncInternal>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Refit.RequestBuilderImplementation.<>c__DisplayClass2a`1.<<buildCancellableTaskFuncForMethod>b__29>d__2c.MoveNext()
必要な動作:
- キャッシュされた学期を取得 -> その学期のキャッシュされたスケジュールを取得、その学期のスケジュールをフェッチ
- 学期を取得 -> その学期のキャッシュされたスケジュールを取得、その学期のスケジュールを取得
私は試した:
- Refitなしでakavache/Akavacheをチェーンすると動作します。
- akavache/Akavacheを使用せずに GetSchedule と GetSemester の Select をチェーンすると、機能します。
回避策や私が間違っていることについてアイデアがある場合は、お知らせください。