1

アプリケーションで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()

必要な動作:

  1. キャッシュされた学期を取得 -> その学期のキャッシュされたスケジュールを取得、その学期のスケジュールをフェッチ
  2. 学期を取得 -> その学期のキャッシュされたスケジュールを取得、その学期のスケジュールを取得

私は試した:

回避策や私が間違っていることについてアイデアがある場合は、お知らせください。

4

0 に答える 0