2014-12-08 12 views
0

현재 Logfile을로드하고 DevExpress XtraGrid에 표시하기 위해 처리하는 샘플 Windows 8 App을 개발 중입니다. 내가 파일 유형 필터에 필요한 확장을 추가 할 때, 코드는 내가 appxmanifest에 파일 확장자를 추가 되었더라도 UnauthorizedAccessException 예외 :FileOpenPicker가 UnauthorizedAccessException을 throw합니다.

private void OpenFile() 
    { 
     try 
     { 
      FileOpenPicker pickLog = new FileOpenPicker(); 
      pickLog.CommitButtonText = "Logdatei öffnen"; 
      pickLog.SuggestedStartLocation = PickerLocationId.ComputerFolder; 
      pickLog.ViewMode = PickerViewMode.List; 
      pickLog.FileTypeFilter.Add(".log"); //This is where the code jumps out 
      pickLog.FileTypeFilter.Add(".slg"); 

      pickLog.PickSingleFileAsync().Completed += delegate 
      { 
       StorageFile logFile = pickLog.PickSingleFileAsync().GetResults(); 
       Stream strLog = logFile.OpenStreamForReadAsync().Result; 

       vm.LoadCommand.Execute(strLog); 
      }; 

      pickLog.PickSingleFileAsync(); 
     } 
     catch (Exception ex) //Catches UnauthorizedAccessException 
     { 
      MessageDialog md = new MessageDialog(ex.Message, ex.GetType().ToString()); 
      md.ShowAsync(); 
     } 
    } 

더 나쁜 것은이있다 내가 FileTypeFilter 라인을 주석 경우, 코드가 내가 거기에 추가 익명 메소드 밖으로 점프 :

private void OpenFile() 
    { 
     try 
     { 
      FileOpenPicker pickLog = new FileOpenPicker(); 
      pickLog.CommitButtonText = "Logdatei öffnen"; 
      pickLog.SuggestedStartLocation = PickerLocationId.ComputerFolder; 
      pickLog.ViewMode = PickerViewMode.List; 
      //pickLog.FileTypeFilter.Add(".log"); 
      //pickLog.FileTypeFilter.Add(".slg"); 

      pickLog.PickSingleFileAsync().Completed += delegate //This is where the code jumps out 
      { 
       StorageFile logFile = pickLog.PickSingleFileAsync().GetResults(); 
       Stream strLog = logFile.OpenStreamForReadAsync().Result; 

       vm.LoadCommand.Execute(strLog); 
      }; 

      pickLog.PickSingleFileAsync(); 
     } 
     catch (Exception ex) //Catches COMException 
     { 
      MessageDialog md = new MessageDialog(ex.Message, ex.GetType().ToString()); 
      md.ShowAsync(); 
     } 
    } 

내가 바로 여기에 문제를 제기하는 이유입니다 결과 (StackOverflow에 포함 소스), 작업없이 끝에 일에 대한 철저한 연구를했다. , COMException이 throw되었습니다

의 HRESULT는 항상 (0x80070005입니다)하지만, 내부 HRESULT (세부 정보 창에 표시되는 HRESULT)은 일반적으로 -21474xxxx했다 : 나는

가 UPDATE

여기 : 주어진 어떤 도움을 주셔서 감사합니다 하지만 내가 높은 권리와 VS에서 내 애플 리케이션을 디버그, 내부 HRESULT는 -2147024891입니다.

+0

"코드가 튀어 나옴"이란 무엇을 의미합니까? –

+0

ComputerFolder가 아닌 다른 SuggestedStartLocation을 시도 했습니까? – Uwe

+0

@BenRobinson "코드가 튀어 나옵니다"라는 말은 코드가 더 이상 실행되지 않고 catch 블록에 직접 연결된다는 의미입니다. – AlphaNERD

답변

1

awaitPickSingleFileAsync 전화가 아닌 것 같습니다.

당신은 같은 일을해야합니다

StorageFile file = await picker.PickSingleFileAsync(); 

당신이 피크 작업에서 StorageFile이 후, 당신은 당신이에, 반대가 어떤 작업을 수행 할 수 있습니다.


피커에서 선택한 항목이 반환 될 때까지 실행을 중지해야합니다. 기본적으로 위의 줄을 사용하여 처리됩니다.

더욱이 나는 MessageDialogShowAsync도 기다리지 않은 비동기 호출임을 알았습니다. 사용법은 다음과 같아야합니다

var messageDialog = new MessageDialog(...); 
await messageDialog.ShowAsync(); 

이하 :

await new MessageDialog('','').ShowAsync(); 

마이크로 소프트를 사용하는 방법에 대한 자세한 명백하기 위해 비동기로 선언 된 모든 메소드에 Async 접미사를 사용하여이 지침 시행 . 나는 당신도 그것을 사용해야한다고 생각합니다.

비동기 호출을 시작하는 경우, 어떤 시점에서이를 기다려야합니다. 그렇지 않으면 예측할 수없는 결과가 발생하여 대부분의 경우 응용 프로그램이 중단 될 수 있습니다.


같은 유형의 메시지 대화 상자 두 개를 표시하려면이 유형의 예외도 실행해야합니다. 한 번에 하나의 메시지 대화 상자 만 화면에 표시 할 수 있으며 첫 번째 메시지가 이미 표시되어있는 동안 두 번째 메시지는 UnauthorizedAccessException을 던지는 조작을 시도합니다.당신은 선택 도구의 Completed 이벤트에 대한 이벤트 처리기를 추가 할 필요가 없습니다

private async Task OpenFile() 
{ 
    try 
    { 
     FileOpenPicker pickLog = new FileOpenPicker(); 
     pickLog.CommitButtonText = "Logdatei öffnen"; 
     pickLog.SuggestedStartLocation = PickerLocationId.ComputerFolder; 
     pickLog.ViewMode = PickerViewMode.List; 
     pickLog.FileTypeFilter.Add(".log"); //This is where the code jumps out 
     pickLog.FileTypeFilter.Add(".slg"); 

     StorageFile logFile = await pickLog.PickSingleFileAsync(); 

     //operations on logFile are safe to be done here (open stream, loadCommand etc) 
    } 
    catch (Exception ex) //Catches UnauthorizedAccessException 
    { 
     MessageDialog md = new MessageDialog(ex.Message, ex.GetType().ToString()); 
     md.ShowAsync(); 
    } 
} 

:


편집

다음은 코드를 변경하는 방법입니다. PickSingleFileAsync 호출이 완료된 후 코드가 logFile에있는 것처럼 실행하면됩니다. 나는 당신의 논리를 알지 못하기 때문에 전체 작업 코드를 제공 할 수 없습니다. 그러나 어떤 경우 든 awaitOpenStreamForReadAsync (MSDN documentation)으로 전화하십시오.

+0

힌트를 보내 주셔서 감사합니다. 답변에 표시된대로 변경 사항을 적용했지만 여전히 작동하지 않습니다. Visual Studio는'catch' 블록에서'await' 문을 허용하지 않습니다. – AlphaNERD

+0

몇 가지 편집 내용을 추가했습니다. 작동하게하려면 지금 정렬 할 수 있기를 바랍니다. 간단히 말해서 비동기 접미사가있는 메소드를 요구해야합니다. async-await 사용법에 대해 좀 더 읽어보십시오. – VasileF

+0

사실입니다. catch 블록에서 기다릴 수는 없습니다. 그런데 왜 그런 식으로 오류를 표시하고 싶습니까? 디버그 목적입니까? 간단히 catch 블록에 중단 점을 넣고 예외에 대한 세부 정보가있는 "ex"변수에 대한 세부 정보를보십시오. – VasileF