7

さて、これが基本的な背景です。このプログラムは Outlook/Exchange に接続し、すべてのメール メッセージを解析して暗号化されているメッセージを確認します。私がやりたいことの 1 つは、マルチスレッドを使用して、メッセージをスキャンするのにかかる時間を短縮することです。

現在、コードは次のようになっています。

foreach (Object item in folder.Items) {
//Checks for encryption and gets needed info and updates count
}

代わりに Parallel.ForEach 関数を利用したいと思います。どうやって設定しようか悩んでました。式を今のように設定しようとしましたが、Object 型が変数として使用されているというエラーが表示されます。これについての助けをいただければ幸いです。

わかりました、与えられたレイアウトは正しいようです。コードは現在次のようになっています。

Parallel.ForEach(folder.Items, item =>
{
//does stuff
});

次のエラーが表示されます。

エラー 15 メソッド System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner, System.Action)' の型引数を使用法から推測できません。型引数を明示的に指定してみてください。

何か案は?ご協力いただきありがとうございます。

さて、私はこのサイトを見つけました: http://blogs.msdn.com/b/pfxteam/archive/2010/03/02/9971804.aspxそして、それは私がエラーに必要な答えを与えてくれました. キャスト関数を作成して、コレクションを汎用コレクションに変更する必要がありました。

static IEnumerable<object> Cast(IEnumerable source)
{
    foreach (object o in source)
        yield return o;
}

そして、オリジナルを微調整して

Parallel.ForEach(Cast(folder.Items), item =>
{
//does stuff
});

現在、エラーなしで実行されます。万歳。

4

2 に答える 2

8

このようなもの:

Parallel.For(0, folder.Items.Count - 1, delegate(int i) { 
  object item = folder.Items[i];
});

または ForEach で:

Parallel.ForEach(folder.Items, item => {whatever you want to do with item})

注: folder.Items は IEnumerable を実装する必要があります

于 2011-11-21T19:32:59.970 に答える