1

私は C# スレッドの初心者であり、基本的なタスクの実装に助けが必要です。現在、正常に動作する以下のコードを (スレッドを使用せずに) 使用しています。概念は、テーブルのレコードをループし、関数でいくつかのテーブル引数を渡し、戻り値を除いて、戻り値でテーブルを更新することです。

cmd = new OleDbCommand { Connection = con, CommandText = "Select recid,col_A,col_B from tblData"};
dr = cmd.ExecuteReader();

if (dr.HasRows)
{
   cmdRec = new OleDbCommand { Connection = con };
   while (dr.Read())
    {
    sReqResult = DoProcessing(dr["col_A"].ToString(), dr["col_B"].ToString(), dr["PARAM2"].ToString());
        sSql = "update tblData set STATUS='" + sReqResult + "' where recid = '" + dr["recid"] + "'";
    cmdRec.CommandText = sSql;
    cmdRec.ExecuteNonQuery(); 
    }
}
dr.close();

スレッドを使用して上記の機能を実装してプロセスを高速化し、レコードを順番に処理する代わりに、最大 25 のスレッドを並行して実行できるようにします。ただし、関数から戻り値を取得し、テーブルで同じ値を更新する必要があります。スレッドプールとタスク (.net 4.0) について読んだことがありますが、同じものを実装する方法がわかりません。サンプルコードを教えてください。

4

2 に答える 2

1

この回答で、非同期実装を自分で作成し、既存のツール/ライブラリを使用しないことを暗示しています。

一般に、非同期コンテキストから単純に値を「返す」ことはできません。代わりに、特定の "return" パラメータ (つまり、結果) を受け取るコールバックを使用できます。

スレッドプールを使用した概念の例:

if (dr.HasRows)
{
    object someDataToWorkWith = "data";

    Action<object> resultCallback = (theResults) =>
    {
        // Executed once the workItem is finished.
        // Work with and/or present the results here.
    };

    WaitCallback workItem = (dataOrSomeDetails) =>
    {
        // This is the main async-part. Work with or fetch data here.
        // You can also access any variables from the containing method.
        // When finished working, execute callback:
        resultCallback("someResults");
    };

    ThreadPool.QueueUserWorkItem(workItem, someDataToWorkWith);
}
于 2012-10-10T11:54:30.687 に答える
0

非同期の ado.net 機能を使用しないのはなぜですか?

于 2012-10-10T11:36:35.340 に答える