簡體   English   中英

將記錄插入到SQL Server CE數據庫移動到另一個線程? C#Compact Framework 3.5

[英]Move record insert to SQL Server CE database into another thread? C# Compact Framework 3.5

我在嘗試將一段代碼放入另一個線程以提高性能時遇到了一些麻煩。

我在下面有以下代碼(帶有注釋的線程添加),其中我解析大型XML文件(最終目標100,000行),然后使用記錄和插入( SqlCeResultSet/SqlCeUpdatableRecord )將其寫入SQL Server CE 3.5數據庫文件( .sdf ) 。

while循環中if語句中的兩行代碼,

xElem = (XElement)XNode.ReadFrom(xmlTextReader);

rs.Insert(record);

花費大約相同的時間來執行。 我想要運行rs.Insert(record); 而我正在解析下一行的xml文件。 但是,我仍然無法使用Thread或ThreadPool來完成它。

我必須確保傳遞給線程的記錄在我執行rs.Insert(record);之前不會更改rs.Insert(record); 在現有的線程中。 因此,我嘗試在寫入新記錄之前放置thread.Join()( record.SetValue(i, values[i]); ),但是當我嘗試運行程序時仍然會出現沖突 - 程序崩潰時出現大量錯誤嘗試多次寫入相同的行(特別是索引)。

任何人都可以幫我提一些建議嗎? 我怎樣才能移動rs.Insert(record); 進入另一個線程來提高性能?

XmlTextReader xmlTextReader = new XmlTextReader(modFunctions.InFName);
XElement xElem = new XElement("item");

using (SqlCeConnection cn = new SqlCeConnection(connectionString))
{
    if (cn.State == ConnectionState.Closed)
        cn.Open();

    using (SqlCeCommand cmd = new SqlCeCommand())
    {
        cmd.Connection = cn;
        cmd.CommandText = "item";
        cmd.CommandType = CommandType.TableDirect;

        using (SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable))
        {
            SqlCeUpdatableRecord record = rs.CreateRecord();

            // Thread code addition
            Thread t = new Thread(new ThreadStart(() => rs.Insert(record));

            while (xmlTextReader.Read())
            {
                if (xmlTextReader.NodeType == XmlNodeType.Element &&
                    xmlTextReader.LocalName == "item" &&
                    xmlTextReader.IsStartElement() == true)
                {
                    xElem = (XElement)XNode.ReadFrom(xmlTextReader);

                    values[0] = (string)xElem.Element("Index"); // 0
                    values[1] = (string)xElem.Element("Name"); // 1
                    ~~~
                    values[13] = (string)xElem.Element("Notes"); // 13

                    // Thread code addition -- Wait until previous thread finishes
                    if (ThreadStartedS == 1)
                    {
                        t.Join()
                    }

                    // SetValues to record
                    for (int i = 0; i < values.Length; i++)
                    {
                        record.SetValue(i, values[i]); // 0 to 13
                    }

                    // Thread code addition -- Start thread to execute rs.Insert(record)
                    ThreadStartedS = 1;
                    t.Start();

                    // Original code without threads
                    // Insert Record
                    //rs.Insert(record);
                }
            }
        }
    }
}

如果要在設備上完成所有處理(從設備上的XML文件讀取然后解析設備上的數據),那么您將看到線程化工作沒有性能提升。

這些Windows Mobile設備只有一個處理器,因此對於它們來說,多線程意味着一個進程可以工作一段時間,然后另一個進程可以工作一段時間。 您永遠不會同時運行同時進程。

另一方面,如果XML文件中的數據位於遠程服務器上,則可以以塊的形式調用數據。 當一個塊到達時,您可以在另一個線程中處理該數據,同時等待下一個數據塊到達主線程。

如果所有這些工作都在一台設備上完成,那么多線程就不會有好運。

您仍然可以使用取消按鈕顯示進度條(從0到NumberOfRecords),以便等待數據收集完成的人不會因預期而瘋狂。

暫無
暫無

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

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