2016-12-30 15 views
0

私はWPFアプリケーションで次のコードを用意しました。このコードでは、CRMの連絡先リストを照会してコレクションに配置し、リストボックスコントロールに表示します。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; 
     }); 
    } 

操作の可能な中断の後、私は空のリストを受け取ります。これは今でもOKですが、操作をキャンセルして、空のリストまたは完全なリストだけでなく、連絡先の部分リストを取得する可能性がある場合は、私は興味があります。

+0

私は 'AsParallel'メソッドを使用しているかどうかを疑うが、ここですべてのいずれかの利点を提供しています。処理時間の大部分はクエリ 'ContactSet'を実行するのに費やされます。結果セットが受け取られると、 'List 'への変換はほんのわずかです。私の推測では、ここでの並列処理を使用すると、実際には同じスレッドを1つのスレッドで実行するより時間がかかります。 –

+0

ありがとう、ヘンク。おそらく、あなたは正しいでしょう。私は再びコードを検討します。 –

答えて

0

小さなページサイズ(1-3の場合)でクエリの結果をページすることができますが、システムを叩きながら、あなたが望むものを達成できます。

ハンマーリングの意味:100レコードがある場合、すべてのレコードを一度に正常にクエリできます(1つのクエリ - > 100の結果:空のままになります)。ページサイズが2の場合は、代わりにCRMを50回クエリします(50x2 = 100の結果です。実行中に完了したクエリの結果が多く表示されます)。

あなたはこれを実装する場合は、ネットワークを見て、あなたはDoS攻撃-INGの自分を終わる可能性...

+0

これは本当に残酷なエンドポイント治療です。ありがとう、アレックス。むしろ、私はこの学問的な問題を閉じ、伝統的なダイナミクスのクエリに戻る... –

関連する問題