문제

PCL LIB에서 파일 시스템에 액세스 할 수 있도록 PCLSTORAGE 라이브러리를 사용하고 있습니다.다음과 같이 파일을 읽으려고합니다.

static async Task<T> LoadAsync<T> (string fileName) where T : class
    {
        var rootFolder = FileSystem.Current.LocalStorage; // debugger stops here
        var m5cacheFolder = await rootFolder.GetFolderAsync (CacheFolderName); // but instead of going to this line, jumps to end of this method
        var userInfoFile = await m5cacheFolder.GetFileAsync (fileName);
        var userInfoFileContent = await userInfoFile.ReadAllTextAsync ();
        var stringReader = new StringReader (userInfoFileContent);
        var serializer = new XmlSerializer (typeof(T));
        return (T)serializer.Deserialize (stringReader);
    }
.

pclStorage가 비동기식이므로 동기화 된 코드에서 사용하고 싶습니다.

var task = LoadAsync<User> (UserInfoFileName);
user = task.Result;
.

이 코드를 실행하려고 할 때 전체 응용 프로그램이 정지하는 문제는 문제입니다.위의 주석에 설명 된대로 LoadAsync 메서드의 코드가 실행되지 않습니다.나는 최신 Xamarin을 사용하고 있습니다. 내 PCL 라이브러리는 Xamarin iOS 프로젝트에서 참조됩니다.두 프로젝트 모두 nugget을 통해 pclStorage에 대한 참조가 있습니다.

다른 한편으로

다음 코드가 올바르게 실행됩니다.

static async void PersistAsync (object obj, string fileName)
    {
        var rootFolder = FileSystem.Current.LocalStorage;
        var m5cacheFolder = await rootFolder.CreateFolderAsync (CacheFolderName, CreationCollisionOption.OpenIfExists);
        var userInfoFile = await m5cacheFolder.CreateFileAsync (fileName, CreationCollisionOption.ReplaceExisting);
        var serializer = new XmlSerializer (obj.GetType ());
        var stringWriter = new StringWriter ();
        serializer.Serialize (stringWriter, obj);
        await userInfoFile.WriteAllTextAsync (stringWriter.ToString ());
    }
.

도움이 되었습니까?

해결책

항상 재해를위한 잠재적 인 조리법입니다.

var task = LoadAsync<User>(UserInfoFileName);
user = task.Result;
.

UI 스레드 에서이 일이 발생하면 기본적으로 작업이 완료 될 때까지 UI 스레드를 차단하지만 태스크는 UI 스레드에서 계속 해당 연속을 실행해야합니다. 교착 상태가있어.

기본적으로 비동기를 더 많이 받아들이려면 앱을 구조화하려고해야합니다. 당신은 Task.ConfigureAwait() LoadAsync의 연속을 스레드 풀 스레드에서 실행하기 위해 지속을 예약하려면 비동기의 정신에 반대하는 완료 될 때까지 UI를 차단할 것입니다.

비동기는 다소 바이러스 성입니다 - 앱 비동기의 부분을 만들려고하면 어려움을 겪을 것입니다. 적어도 UI 작업 측면에서는 비동기식이 필요합니다.

(PersistAsync가 리턴 한 작업을 기다리는 차단하면 비슷한 문제가 발생합니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top