2012-10-10 18 views
1

我是c#線程的新手,需要幫助實現一項基本任務。 我目前正在使用下面的代碼(沒有使用線程),它運行良好。 這個概念是循環遍歷一個表的記錄,在函數中傳遞一些表參數,除了返回值,然後用返回值更新表。使用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(); 

我想用線程來加快這一進程,從而代替sequentely處理的記錄,我可以並行運行最多25個線程來實現上述功能。但要求是從函數獲取返回值並在表中更新相同的值。 我已閱讀關於threadpool和任務(在.net 4.0中),但我不知道如何實現相同。請用一些示例代碼指導我。

+0

請注意,你的代碼是容易受到SQL注入,看看它 – Termiux

回答

1

有了這個答案,我暗示你想自己創建異步實現,而不是使用現有的工具/庫。

一般情況下,你不能簡單地從異步上下文中「返回」一個值。相反,你可以有一個回調,它需要一些「返回」參數(即結果)。與線程池

概念例如:

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); 
} 
相關問題