Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否将插入SQL Server CE数据库的记录移动到另一个线程中?C#紧凑型框架3.5_C#_Multithreading_Windows Mobile_Sql Server Ce_Compact Framework - Fatal编程技术网

是否将插入SQL Server CE数据库的记录移动到另一个线程中?C#紧凑型框架3.5

是否将插入SQL Server CE数据库的记录移动到另一个线程中?C#紧凑型框架3.5,c#,multithreading,windows-mobile,sql-server-ce,compact-framework,C#,Multithreading,Windows Mobile,Sql Server Ce,Compact Framework,我在尝试将一段代码放入另一个线程以提高性能时遇到了一些困难 我在下面有以下代码(带有带注释的线程添加),其中我解析大型XML文件(最终目标100000行),然后使用record和insert(SqlCeResultSet/sqlceupdateablerecord)将其写入SQL Server CE 3.5数据库文件(.sdf) while循环中if语句中的两行代码 xElem = (XElement)XNode.ReadFrom(xmlTextReader); 及 执行所需的时间大致相同。我

我在尝试将一段代码放入另一个线程以提高性能时遇到了一些困难

我在下面有以下代码(带有带注释的线程添加),其中我解析大型XML文件(最终目标100000行),然后使用record和insert(
SqlCeResultSet/sqlceupdateablerecord
)将其写入SQL Server CE 3.5数据库文件(
.sdf

while循环中if语句中的两行代码

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

执行所需的时间大致相同。我想运行
rs.Insert(记录)在解析下一行xml文件时。然而,我仍然无法使用线程或线程池来完成它

我必须确保传递给线程的记录在我完成执行
rs.Insert(记录)之前不会被更改在现有线程中。因此,我尝试在写入新记录之前放置thread.Join()(
record.SetValue(I,values[I]);
),但在尝试运行程序时仍然会遇到冲突-由于多次尝试写入相同的行(尤其是索引),程序会崩溃并出现大量错误

有人能帮我提些建议吗?如何移动
rs.Insert(记录)插入另一个线程以提高性能

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);
                }
            }
        }
    }
}
XmlTextReader XmlTextReader=新的XmlTextReader(modFunctions.InFName);
XElement xElem=新XElement(“项目”);
使用(SqlCeConnection cn=newsqlceconnection(connectionString))
{
if(cn.State==ConnectionState.Closed)
cn.Open();
使用(SqlCeCommand cmd=new SqlCeCommand())
{
cmd.Connection=cn;
cmd.CommandText=“项目”;
cmd.CommandType=CommandType.TableDirect;
使用(SqlCeResultSet rs=cmd.executesultset(resultstoptions.updateable))
{
SQLCEUpdateableRecord=rs.CreateRecord();
//线程代码添加
线程t=新线程(新线程开始(()=>rs.Insert(记录));
while(xmlTextReader.Read())
{
if(xmlTextReader.NodeType==XmlNodeType.Element&&
xmlTextReader.LocalName==“项”&&
xmlTextReader.IsStartElement()=真)
{
xElem=(XElement)XNode.ReadFrom(xmlTextReader);
值[0]=(字符串)xElem.Element(“索引”);//0
值[1]=(字符串)xElem.Element(“名称”);//1
~~~
值[13]=(字符串)xElem.Element(“注释”);//13
//线程代码添加--等待上一个线程完成
如果(ThreadStartedS==1)
{
t、 加入
}
//设置要记录的值
for(int i=0;i
如果您的所有处理都将在设备上完成(从设备上的XML文件读取,然后解析设备上的数据),那么您的工作线程化不会提高性能

这些Windows Mobile设备只有一个处理器,因此对它们来说,多线程意味着一个进程工作一段时间,然后另一个进程工作一段时间。您永远不会同时运行多个进程

另一方面,如果XML文件中的数据位于远程服务器上,则可以分块调用数据。当数据块到达时,您可以在另一个线程中处理该数据,同时等待下一个数据块到达主线程

如果所有这些工作都是在一台设备上完成的,那么使用多线程将不会有好运气


您仍然可以使用“取消”按钮显示进度条(从0到NumberOfRecords),这样等待数据收集完成的人不会因为预期而发疯。

请注意,SQL Compact ADO.NET对象不是线程安全的,因此您必须为每个线程创建一个SqlCeConnection对象
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);
                }
            }
        }
    }
}