2013-10-23 2 views
1

내 코드에서 창 전화 7에 대한 API를 사용하여 skydrive에서 폴더를 가져 오려고합니다. 폴더를 가져 오는 데 listbox를 사용하고 있습니다. 폴더가 성공적으로로드되지만 UI가 중단되지만 버튼을 다시 누르면 페이지가 다시 열립니다. 은 여기 내 목록 상자처음로드 할 때 목록 상자 UI가 응답하지 않는다

<ListBox Grid.Row="1" x:Name="lbFolders" 
       Margin="0" SelectionChanged="lbFolders_SelectionChanged"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 
        <Border Background="#007ccf" Margin="0,0,15,4"> 
         <Image Source="/DataHub;component/images/icon_folder.png" Width="48" Height="48" /> 
        </Border> 
        <TextBlock Text="{Binding Name}" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

이며, 여기가

VAR 스카이 드라이브 데이터

private void GetMetaDataAsyncSkyDriveCompleted(object sender, LiveOperationCompletedEventArgs e) 
    { 
     progressBar1.IsLoading = false; 

     if (!String.IsNullOrEmpty(e.RawResult)) 
     { 

      var metaData = JsonConvert.DeserializeObject<SkyDriveFolderDataContainer>(e.RawResult); 

      if (metaData.data.Count > 0) 
       metaData.data.ForEach(x => x.Name = x.name); 

      if (SkyDriveHashSet == null) SkyDriveHashSet = new Dictionary<string, SkyDriveFolderDataContainer>(); 

      if (SkyDriveHashSet.ContainsKey(TargetPath)) 
      { 
       SkyDriveHashSet[TargetPath] = metaData; 
      } 
      else 
      { 
       SkyDriveHashSet.Add(TargetPath, metaData); 
      } 

      if (!HasSchemaInIt(metaData.data, TargetPath)) 
      { 
       SkyDriveDisplayData.Clear(); 
       if (metaData != null && metaData.data != null && metaData.data.Count > 0) 
       { 
        var folderList = metaData.data.Where(x => x.type == FileConstants.SkyDriveFolderKeyword && x.shared_with.access == FileConstants.SkyDriveMyFiles).ToList(); 

        if (folderList.Any()) 
        { 
         folderList.ForEach(x => x.Name = x.name.Length > 15 ? x.name.Substring(0, 12) + "..." : x.name); 

         folderList.ForEach(x => SkyDriveDisplayData.Add(x)); 
        } 
       } 
       CurrentPath.Text = TargetPath; 
       SetVisibilityAfterGetMetaData(); 
      } 

      if (App.ViewModel.SkyDriveSelectedFolderDictionary.ContainsKey(TargetPath)) 
       SkyDriveParentFolderId = App.ViewModel.SkyDriveSelectedFolderDictionary[TargetPath]; 
     } 
     else 
     { 
      MessageBox.Show(String.Format("SkyDrive replied: {0}", e.Error.Message)); 
     } 
    } 

답변

0

시도가 TaskEx.Run에 JsonConvert.DeserializeObject을 넣어 얻기 위해 비동기에게 전화를 기다리고 있습니다 내 기능입니다 parsedResult = TaskEx.Run (() => JsonConvert.DeserializeObject (resultString))을 기다립니다.

+0

내 함수 GetMetaDataAsyncSkyDriveCompleted를 async라고 부르면 비동기 객체 역 직렬화를 호출해야합니다. –

+0

또한 창 전화 8에서 사용되지만 나는 창 전화 7 응용 프로그램에 이것을 사용하고 있습니다. –

+0

그냥 Bcl을 설치하면 wp7에 async가 생깁니다. https://www.nuget.org/packages/Microsoft.Bcl.Async/1.0.12-beta –

관련 문제