1

次のようなメソッドがあります。

public void SomeMethod()
{
    foreach (SomeModel x in TheListOfSomeModel)
    {
        do some work
        ....
        if (SomeCondition)
        {
             x.ExecuteQuery();
        }
    }
}

基本的にSomeModel、オブジェクトのプロパティをデータベースのフィールドに格納する更新クエリを実行するメソッドがあります。コードは現在作成されているため、クエリを実行する必要がある場合、クエリが完了するまでループ全体が保留されます。if が何らかの用途に使用できる場合、 には 5 つの要素しかありませんTheListOfSomeModel

を使用する以外に、これを別のスレッドで実行するParrallel ForEachように変更するにはどうすればよいですか?x.ExecuteQuery()

ありがとう。

4

3 に答える 3

3

このようなタスクとして実行できます...

Task.Factory.StartNew(() => x.ExecuteQuery());
于 2013-02-21T01:11:39.083 に答える
2

タスク/スレッドを生成するときにループ変数を閉じないように注意してください (C# 5 を使用している場合を除く)。また、スレッドごとに個別の接続/コンテキストを使用するようにしてください。

public void SomeMethod()
{
    foreach (SomeModel x in TheListOfSomeModel)
    {
        var model = x;
        //do some work
        ....
        if (SomeCondition)
        {
             Task.Factory.StartNew(() => model.ExecuteQuery());
        }
    }
}
于 2013-02-21T01:16:05.817 に答える
0

簡潔にするために例外処理を省略します。

using System.Threading.Tasks;    
....

public void SomeMethod()
{
    Task.Factory.StartNew(()=>
    {
        foreach (SomeModel x in TheListOfSomeModel)
        {
            //do some work
            ....
            if (SomeCondition)
            {
                 x.ExecuteQuery();
            }
         }
     });
}

これにより、新しいスレッドで実行されます。UI でこれを行っているときに CrossThreadExceptions が発生した場合は、Invokeまたはを介し​​て UI コントロールにアクセスする必要がありますBeginInvoke

于 2013-02-21T01:17:11.363 に答える