2017-05-14 8 views
2

로컬 텍스트 파일에서 일부 데이터를 저장 및 검색하려고하는 UWP 응용 프로그램이 있지만 응용 프로그램을 교착 상태에 빠뜨리려 고해도 아무 문제가 없습니다. 일어날 동기가 필요한 물건 때문에, 나는 작업을 사용하고 그 완료를 기다린다. 그럼에도 불구하고, 응용 프로그램은 잠근다.이 교착 상태를 해결하는 방법은 무엇입니까?

나는 "MainPage"라는 내 UWP 응용 프로그램과의 생성자에 페이지가 나는 다음과 같은 코드를 가지고는 뷰 모델에 대한 방법을 (호출하기 때문에

var listenkeyViewModel = new ListenkeyViewModel(); 
listenkeyViewModel.GetKey(); 
listenkey = listenkeyViewModel.Listenkey; 

가져 오기 키 여기에 문제가있다을하는 내가 호출 동기가 최대한 빨리 것이 바람직 할 것이다 만드는 생각했기 때문에 나는 동기로 만들었습니다.

public void GetKey() 
{ 
    try 
    { 
     var listenKeyTask = RetrieveListenKey(); 
     _listenkey = listenKeyTask.Result; 
    } 
    catch (Exception e) 
    { 
    } 
} 

public static async Task<string> RetrieveListenKey() 
{ 
    try 
    { 
     var storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder; 
     var listenkeyFile = await storageFolder.GetFileAsync("listenkey.txt"); 
     return await Windows.Storage.FileIO.ReadTextAsync(listenkeyFile); 
    } 
    catch (Exception e) 
    { 
     throw new Exception("Could not load file"); 
    } 
} 

을 나는 것입니다 "끝까지 비동기"알고 있지만이 나는 생성자를 만들 수 없습니다. 여기 수없는 곳 원래 코드는 비동기 적입니다. 어떻게하고 있습니까? 교착 상태에 빠지기로되어 있나? 난 이해가 안 돼요.

+4

코드를 생성자에서 멀리 옮깁니다. 'InitializeAsync'또는 무엇이든간에 비동기 메소드를 사용하십시오. 최상의 솔루션입니다. –

답변

3

public async Task GetKey() { 
    try { 
     var listenKeyTask = RetrieveListenKey(); 
     _listenkey = await listenKeyTask; 
    } catch (Exception e) { 
     //...should handle/log error 
    } 
} 

이동 생성자의 출력 및 이벤트 핸들러에이의 호출을 기다리고/비동기하기 GetKey을 변환합니다. 페이지로드 또는 페이지의 수명주기 초반에 호출 된 다른 이벤트와 유사합니다. 이 프로세스가 교착 상태없이 흐르게해야하므로

partial class MainPage : Page { 
    ListenkeyViewModel listenkeyViewModel; 
    string listenkey; 

    public MainPage() { 
     InitializeComponent(); 
     listenkeyViewModel = new ListenkeyViewModel(); 
     // add a handler to be called when the page has been loaded 
     this.Loaded += OnPageLoaded;    
    } 

    async void OnPageLoaded(object sender, RoutedEventArgs e) {    
     await listenkeyViewModel.GetKey(); 
     listenkey = listenkeyViewModel.Listenkey; 
    } 

    // Shown for demonstration purposes only. 
    // This is typically autogenerated by Visual Studio. 
    private void InitializeComponent() { 
    } 
} 

async void

는 이벤트 핸들러에 허용된다.