任务和计时器错误#

时间:2017-06-09 21:45:35

标签: c#

先生,女士我有问题。出现错误:“进程无法访问文件'C:\ temps \ 1.pdf',因为它正由另一个进程使用。”而我想要做的就是在没有错误的情况下访问该路径。

我有一个名为“temps”的文件夹,它是我存储我的pdf的地方。

我的计时器设置为10毫秒。每10毫秒我的命令“SELECT * FROM schedule WHERE CustID = @ ID&& St = @ stnow&& Se = @sen”将执行,之后我的DataAdapter“ad”将填充我的数据集“ds”由我的ReportClass“report2”用于将pdf导出到我的文件夹“temps”。

如果我的代码或我构建代码的方式有问题,请告诉我“注意:”这个项目是为了提高我的技能。我接受建设性的批评,我非常感谢你的回复/答复。“

以下是我的代码:

private void Elapsed_Time_Tick(object sender, EventArgs e)
{
  label1.Text = DateTime.Now.ToLongTimeString();
  DateTime timeticking = DateTime.Now; // Just to check my time.
  Task t = new Task(() => getreport()); // run my function
  t.Start();
}

private void getreport()
{
  using (MySqlConnection con4 = new MySqlConnection(connString))
  {
   con4.Open();
   using (MySqlCommand com4 = new MySqlCommand("SELECT * FROM 
          schedule WHERE CustID=@ID && St 
          =@stnow && Se=@sen", con4))
    { 
     string status="Complete";
     string sentss="Ready";
     MySqlDataAdapter ad = new MySqlDataAdapter();
     com4.Parameters.AddWithValue("@stnow", status);
     com4.Parameters.AddWithValue("@sentss", sentss);
     com4.Parameters.AddWithValue("@ID", CusID); 
     ad = new MySqlDataAdapter(com4);
     DataSet1 ds = new DataSet1();
     ad.Fill(ds.reporting_schedule);
     ReportClass report2 = new CrystalReport1();
     report2.SetDataSource(ds);
     report2.ExportToDisk
     (CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, 
     @"C:\\temps\\" + CusID + ".pdf"); //This is the error          
     report2.Close();
     com4.Dispose();
     ad.Dispose();
    }
  con4.close();
  }
}

如果您有任何疑问,请告知我们。

1 个答案:

答案 0 :(得分:1)

假设您的任务之一是锁定文件而不是某些外部进程,您可以使用lock statement来确保一次只能有一个任务写入文件:

// This object is used to ensure only one task can access the file at a time
private object fileLock = new object();

private void GetReport()
{
    // previous code omitted...

    // before we try to write to the file, we wait for our lock object to become available
    lock (fileLock)
    {
        report2.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat,
            @"C:\temps\" + CusID + ".pdf");
    }

    // later code omitted...
}

来自the documentation

lock关键字确保一个线程不进入代码的关键部分,而另一个线程处于临界区。如果另一个线程试图输入锁定的代码,它将等待,阻止,直到该对象被释放。