我的代码是真的,但错误信息会停止我的程序

时间:2014-01-07 17:02:09

标签: c# insert binary

我为sql数据库编写了一个插入文件的代码。当程序正在运行时,错误消息停止工作: 这是错误消息:

“CLR无法从COM上下文0x52dd08过渡到COM上下文0x52de78 60秒。拥有目标上下文/公寓的线程很可能是在进行非抽空等待或处理非常长时间运行的操作而无需泵送Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序无响应或内存使用量不断累积。为避免此问题,所有单线程单元(STA)线程都应使用抽取等待原语(如CoWaitForMultipleHandles)并在长时间运行期间定期泵送消息“

请帮帮我。我该怎么做。 这是我的代码:

                    for (int i = 0; i < c; i++)
                    {
                        progressBar1.Visible = true;
                        progressBar1.Maximum = c;
                        progressBar1.Minimum = 0;
                        progressBar1.Step = 1;
                        byte[] jalal = null;
                        FileInfo fi = new FileInfo(listBox1.Items[i].ToString());
                        FileStream fs = new FileStream(listBox1.Items[i].ToString(), FileMode.Open, FileAccess.Read);
                        BinaryReader br = new BinaryReader(fs);
                        long totalbytes = new FileInfo(listBox1.Items[i].ToString()).Length;
                        jalal = br.ReadBytes((Int32)totalbytes);
                        fs.Close();
                        fs.Dispose();
                        br.Close();
                        byte[] bytes = File.ReadAllBytes(listBox1.Items[i].ToString());
                        SqlParameter fileP = new SqlParameter("@file", SqlDbType.VarBinary);
                        fileP.Value = bytes;
                        SqlParameter name = new SqlParameter("@pname", SqlDbType.NVarChar);
                        name.Value = fi.Name;
                        SqlParameter add = new SqlParameter("@padd", SqlDbType.NVarChar);
                        add.Value = listBox1.Items[i].ToString();
                        SqlCommand myCommand = new SqlCommand();
                        myCommand.Parameters.Add(fileP);
                        myCommand.Parameters.Add(name);
                        myCommand.Parameters.Add(add);
                        SqlConnection conn = new SqlConnection(@"Data Source=.;Initial Catalog=pdf;Integrated Security=True");
                        if (conn.State != ConnectionState.Open)
                            conn.Open();
                        myCommand.Connection = conn;
                        myCommand.CommandText = "spPdfInsert";
                        myCommand.CommandType = CommandType.StoredProcedure;
                        progressBar1.PerformStep();

                        Thread.Sleep(50);
                        try
                        {
                            myCommand.ExecuteNonQuery();

                        }
                        catch
                        {
                            kh++;
                            eror += this.listBox1.Items[i].ToString() + "\r\n";
                        }

                        conn.Close();
                        cc++;
                    }

1 个答案:

答案 0 :(得分:2)

它表示错误消息中的问题:

  

拥有目标上下文/公寓的线程很可能是在进行非抽空等待或处理非常长时间运行的操作而不抽取Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序无响应或内存使用量不断累积。

您的整个应用在执行插入语句时是否会冻结?

在主线程中运行长操作通常是不好的做法。我建议在一个线程中运行这些insert语句,例如BackgroundWorker thread

编辑:

看起来你正在尝试更新ProgressBar,所以也许你已经在另一个线程中运行了它。如果你是,那么你的问题可能在其他地方,我将删除这个答案。