我有一个名为“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();
}
}
如果您有任何疑问,请告知我们。
答案 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...
}
lock关键字确保一个线程不进入代码的关键部分,而另一个线程处于临界区。如果另一个线程试图输入锁定的代码,它将等待,阻止,直到该对象被释放。