![](/img/trans.png)
[英]Store an image in a SQL Server CE database C# Compact framework code
[英]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.