2016-12-30 2 views
0

WPF 앱에서 다음 코드를 준비했습니다. 이 코드는 CRM 연락처 목록을 쿼리하여 컬렉션에 배치하고 ListBox 컨트롤에 표시합니다.Dynamics CRM - 쿼리 취소 및 부분 결과 수신

XAML :

<Window x:Class="WPFDynamics365.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WPFDynamics365" 
    xmlns:fa="http://schemas.fontawesome.io/icons/" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="600" Width="800"> 

<Window.Resources> 
    <Storyboard x:Key="WaitStoryboard"> 
     <DoubleAnimation 
    Storyboard.TargetName="Wait" 
    Storyboard.TargetProperty="(TextBlock.RenderTransform).(RotateTransform.Angle)" 
    From="0" 
    To="360" 
    Duration="0:0:2" 
    RepeatBehavior="Forever" /> 
    </Storyboard> 
</Window.Resources> 



<Grid Name="mainGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition></ColumnDefinition> 
    </Grid.ColumnDefinitions> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="2*"></RowDefinition> 
     <RowDefinition Height="6*"></RowDefinition> 
     <RowDefinition Height="2*"></RowDefinition> 
    </Grid.RowDefinitions> 

    <!-- fa to jest TextBlock --> 
    <fa:FontAwesome 
     Panel.ZIndex="999" Icon="Spinner" Name="Wait" 
     Grid.Column="0" Grid.Row="1" 
     HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="50" 
     RenderTransformOrigin="0.5, 0.5" Margin="20" Width="100"> 
     <TextBlock.RenderTransform> 
      <RotateTransform Angle="0" /> 
     </TextBlock.RenderTransform> 
    </fa:FontAwesome> 

    <Label Margin="0,20,0,0" FontSize="20" HorizontalAlignment="Center" Width="100" Grid.Row="0" Name="count"></Label> 

    <ListBox 
     DisplayMemberPath="FullName" SelectedValuePath="Id" Name="contactList" 
     Grid.Column="0" Grid.Row="1" Panel.ZIndex="0" 
     Width="300" Height="300" HorizontalAlignment="Center"> 

    </ListBox> 

    <Button Grid.Column="0" Grid.Row="2" 
     Width="200" Height="50" Margin="0,10,0,0" 
     Name="cancel" Content="Stop downoloading Contacts"> 

    </Button> 

</Grid> 

코드 :

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Loaded += async (sender, args) => 
     { 
      CancellationTokenSource tokenSource = new CancellationTokenSource(); 
      cancel.AddHandler(Button.ClickEvent, new RoutedEventHandler((s, a) => 
      { 
       tokenSource.Cancel(); 
      })); 
      var context = App.CRM.Context; 
      CrmFactor factor = CrmFactor.Create(); 

      ((Storyboard)FindResource("WaitStoryboard")).Begin(); 
      EntitiesExplorer exp = new EntitiesExplorer(factor); 

      var contacts = await exp.GetContacts(tokenSource.Token); 
      count.Content = contacts?.Count.ToString(); 
      contactList.ItemsSource = contacts; 
      ((Storyboard)FindResource("WaitStoryboard")).Stop(); 
      Wait.Visibility = Visibility.Collapsed; 
     }; 


    } 
} 

은 다운로드 접촉의 과정은 사용자에 의해 중단 될 수 있습니다. 전체 연락처 다운로드는 취소 토큰이있는 TPL을 사용하여 수행됩니다. 게터 :

public async Task<List<Contact>> GetContacts(CancellationToken ct) 
    { 
     List<Contact> list = new List<Contact>(); 
     return await System.Threading.Tasks.Task.Run(() => 
     { 

      try 
      { 
       list = _crmFactor.Context.ContactSet.AsParallel().WithCancellation(ct).ToList(); 
      } 
      catch { } 

      return list; 
     }); 
    } 

작업의 가능성이 중단 된 후 나는 빈 목록이 표시됩니다. 지금은 괜찮습니다. 그러나 작업을 취소하고 비어 있거나 완전한 목록이 아닌 연락처의 부분 목록을 얻을 수있는 가능성이 있다면 궁금합니다.

+0

... 자신의 DoS - 보내고 끝낼 수 있었다. 대부분의 처리 시간은'ContactSet' 쿼리를 실행하는 데 소비됩니다. 결과 세트가 수신되면'List '으로의 변환은 아주 간단합니다. 내 생각 엔 병렬 처리를 사용하면 실제로는 단일 스레드에서 동일한 작업을 수행하는 것보다 시간이 더 걸릴 것입니다. –

+0

헨크 감사합니다. 아마 네 말이 맞을거야. 코드를 다시 살펴 보겠습니다. –

답변

0

작은 페이지 크기로 쿼리 결과를 페이지 할 수 있습니다 (1-3). 시스템을 망치는 것이지만 원하는 것을 얻을 수 있습니다.

나는 망치질을 의미합니다 : 100 개의 레코드가있는 경우 모두 한 번에 정상적으로 쿼리 할 수 ​​있습니다 (1 개의 쿼리 -> 100 개의 결과 : 사용자가 비워두면 취소됨). 페이지 크기가 2 인 경우 대신 CRM을 50 번 쿼리 (50x2 = 100 개의 결과가 표시됩니다. 취소하면 실행 중에 완료 한 쿼리의 결과가 많이 나타납니다).

이를 구현하는 경우

가 네트워크를보고, 당신은 내가`AsParallel` 방법을 사용하는 모든 여기에 어떤 혜택을 제공 여부를 의심

+0

정말 잔인한 엔드 포인트 처리법입니다. 고마워, 알렉스. 오히려, 나는이 학문적 인 문제를 닫고 전통적인 역 동성 질의로 돌아 간다 ... –