簡體   English   中英

使用C#線程池或任務來調用函數並獲取返回值

[英]use c# threadpool or task to call a function and get return value

我是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中)的信息,但是我不確定如何實現它們。 請用一些示例代碼指導我。

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

通常,您將無法簡單地從異步上下文中“返回”值。 相反,您可以使用帶有某些“返回”參數(即結果)的回調。

線程池的概念示例:

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);
}

為什么不使用異步ado.net功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM