string filepath = Environment.CurrentDirectory + @"Expense.xml";
public void WriteToXML(object param)
{
Expense exp = (Expense)param;
if (File.Exists(filepath)) {
XDocument xDocument = XDocument.Load(filepath);
XElement root = xDocument.Element("Expenses");
IEnumerable<XElement> rows = root.Descendants("Expense");
XElement firstRow = rows.First();
firstRow.AddBeforeSelf(new XElement("Expense",
new XElement("Id", exp.Id.ToString()),
new XElement("Amount", exp.Amount.ToString()),
new XElement("Contact", exp.Contact),
new XElement("Description", exp.Description),
new XElement("Datetime", exp.Datetime)));
xDocument.Save(filepath);
}
}
Expense exp = new Expense();
exp.Id = new Random().Next(1, 10000);
exp.Amount = float.Parse(text1[count].Text);
exp.Contact = combo1[count].SelectedItem.ToString();
exp.Description = rtext1[count].Text.ToString();
exp.Datetime = DateTime.Now.ToString("MM-dd-yyyy");
workerThread = new Thread(newParameterizedThreadStart(WriteToXML));
workerThread.Start(exp); // throws System.IO.IOException
Saya tidak dapat menulis ke file XML dengan tapak pekerja - Saya mendapatkan kesalahan ini:
System.IO.IOException: 'Proses tidak dapat mengakses file 'C:\work\FinanceManagement\FinanceManagement\bin\DebugExpense.xml' karena sedang digunakan oleh proses lain.
tapi kalau saya pakai seperti WriteToXML(exp);
berhasil. Saya pikir XDocument.Load(filepath)
tidak aman untuk thread. Bagaimana cara mengatasi masalah ini?
File.Exists
rentan terhadap kondisi balapan. Jika Anda memiliki thread yang beroperasi sangat berdekatan, Anda bisa mendapatkan beberapa thread di blok kode tersebut secara bersamaan. - person Crowcoder   schedule 10.05.2019lock
. Atau, jangan dorong karya ini ke topik baru. Apa alasan melakukan hal itu? - person Crowcoder   schedule 10.05.2019threads
. Itu sebabnya saya menggunakan metode ini. - person TRomesh   schedule 10.05.2019