2017-12-06 27 views
0

ループ内でOutlook APIを多く呼び出すコードがあります。 OutlookはワーカースレッドからAPIへのアクセスが気に入らないので、メインスレッドを使用する必要があります。ネットワーククエリを行うコードの部分は、async/awaitで完全に正常ですので、UIはフリーズしません。しかし、コードがCPU集約的な部分(Outlook APIへの呼び出し)に達すると、UIが明らかにフリーズします。C#VSTOアドインでOutlook UIを反応させる方法UIスレッドでCPUを大量に使用する場合

各10ms経過後に実行されるawait Task.Delay(1)が挿入されていますが、タイマーの分解能があまり正確ではないため(15ms)、コードが著しく遅くなります(UIのブロックは解除されますが)。 Task.Yield代わりのTask.Delay(1)を使用して

DateTime d1 = DateTime.Now; 
int interval = 10; 
foreach (SomeItem item in items) 
{ 
    // Intense access to Outlook API... 
    // ... 

    DateTime d2 = DateTime.Now; 
    if (d2.Subtract(d1).TotalMilliseconds > interval) 
    { 
     await Task.Delay(1); 
     d1 = d2; 
    } 
} 

は、UIを(MSDNはとにかくこのためTask.Yieldをお勧めしていません)のブロックを解除しません。

10msから大きな値(100ms)をに変更すると、パフォーマンスの低下が最小限に抑えられ、UIはやや反応しますが、滑らかになりません。

UIのスムーズさとパフォーマンスの間にトレードオフがあるとは限りません。おそらく、良い古いApplication.DoEventsのようですが、現代的でお勧めの方法ですか?

答えて

2

OOMを単独で使用する方法はありません。拡張MAPIはスレッドセーフですが、C++またはDelphiからのみアクセスできます。 Redemption(任意の言語)を使用できます。そのRDOオブジェクトファミリは純粋にMAPIベースであり、セカンダリスレッドから使​​用できます。 Application.Session.MAPIOBJECTをメインスレッドの専用変数に保存します(この方法では、その変数のみをマーシャリングする必要があります)。セカンダリスレッドでRDOSessionオブジェクトのインスタンスを作成し(この方法でMAPIシステムはそのスレッドで初期化されます)、そのMAPIOBJECTプロパティをメインスレッドに保存されている変数に設定します。これにより、2人は同じMAPIセッションを共有します。その後、RDOSession.GetFolderFromID/GetDefaultFolder/etcを使用してフォルダを取得できます。アイテムを処理します。

+0

ええ、OOMを使用しないと問題は解消されませんが、それは私の選択肢ではありません。 – Alex

0

OOMはセカンダリスレッドから使​​用できないことがわかっているか、コード内で例外が発生する可能性があります。 Outlookの最新バージョン
は、このようなユースケースを検出し、例外をスローする可能性があります。しかし、Outlookが基づいている低レベルのAPI、つまり拡張MAPIやRedemptionなどのAPIのラッパーを自由に使用できます。

Exchangeプロファイルのみを扱う場合は、EWSまたはOutlook APIを使用してセカンダリスレッドで必要なデータを取得することを検討することがあります。詳細については、EWS Managed API, EWS, and web services in Exchangeを参照してください。

+0

はい、私はEMAPIまたはEWSを使用する可能性を認識しています。しかし、私の質問ははるかに「狭く」具体的でした。主なスレッドでUIイベントを処理していたのではなく、OOMの代替案ではありませんでした(別の非常に大きな話になります)。 – Alex

+0

目的の機能を実装するための簡単なメカニズムはありません。とにかく、ユーザーは遅延やUIのフリーズに陥ると思います。拡張MAPIを拒否する理由は何ですか?これは、Outlook開発者が使用する必要がある場合とまったく同じです。 –

+0

理論的には、はい。しかし、実際には、Extを使うためにアプリ全体を書き直すのは大変な作業です。 MAPI。私はちょうどそれのための十分なリソースがありません。 – Alex

関連する問題