0

MAPI を介して Inbox 内のオブジェクトを反復する IEnumerable を返す関数がありますが、比較的遅いため、接続のプールを作成し、それらをマルチスレッド方式で使用します。何千もの安価なスレッドで PLINQ を使用することは可能ですか?

4

2 に答える 2

2

「MAPI を介して」、Outlook オブジェクト モデル (VSTO で使用可能) を参照している場合は、スレッドを使用しないでください (PLINQ を介して、または明示的に)。Outlook オブジェクト モデルは、すべての呼び出しをメイン スレッドにマーシャリングするため、メイン スレッド自体から直接実行する場合よりもプロセスが遅くなります。

Outlook ソリューションを開発するための API またはテクノロジの選択から:

Outlook オブジェクト モデルと PIA へのすべての呼び出しは、Outlook のメイン フォアグラウンド スレッドで実行されます。Outlook オブジェクト モデルがサポートする唯一のスレッド モデルは、シングル スレッド アパートメント (STA) です。バックグラウンド スレッドからの Outlook オブジェクト モデルまたは PIA の呼び出しはサポートされていないため、ソリューションでエラーや予期しない結果が生じる可能性があります。

マネージ コードを使用して MAPI にマルチスレッド アクセスする場合は、Redemptionライブラリ (市販のサードパーティ ソリューション) を使用することをお勧めします。

于 2012-06-01T19:45:42.917 に答える
0

これは、タスクのPLINQソリューションのアイデアです。

public IEnumerable<IMessage> GetMessagesParallel(IEnumerable<IConnection> connections)
{
    return connections
        .AsParallel()
        .WithDegreeOfParallelism(10)
        .SelectMany(connection => GetMessages(connection));
}

このメソッドは、すぐに使用できる多数の接続を受け入れます。10個のスレッドが、各接続から並列にメッセージのプルを開始します。GetMessages実際にメッセージをプルするメソッドです。

于 2012-06-01T21:54:33.627 に答える