In my application, When I click the submit button on the MainForm, the Please Wait form appears, which shows untill the processing is complete. The submit button redirects to Books.cs. When someone accidentally clicks the Close(X) sign on the main form(MainForm.cs), the execution is not terminated, the please wait form continues to show and completes the process. It is because the processing is done on a different thread. What I want that when the processing is in progress, and then the cross sign on the MainForm should be disabled.
My code -
My code -
C#:
Books.cs
CancellationTokenSource cts;
private async Task btnClick()
{
try
{
cts = new CancellationTokenSource();
PleaseWait pleasewait = new PleaseWait();
pleasewait.Closed += PleaseWait_Closed;
pleasewait.Show();
// Perform your long-running task asynchronously
await Task.Run(() => ProcessBookstoreExcel(cts.Token));
pleasewait.Closed -= PleaseWait_Closed;
pleasewait.Close();
MessageBox.Show("Processing Complete!");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
cts.Dispose();
cts = null;
}
}
private void PleaseWait_Closed(object sender, EventArgs e) => cts.Cancel();
private void ProcessBookstoreExcel(CancellationToken cancellationToken)
{
string path = TxtBox.Text;
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
var records = new List<BookRecord>();
using (var package = new ExcelPackage(new FileInfo(path)))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
int rowCount = worksheet.Dimension.Rows;
for (int row = 2; row <= rowCount; row++) // Skip header row
{
cancellationToken.ThrowIfCancellation();
records.Add(new BookRecord
{
LineNumber = row,
ISBN = worksheet.Cells[row, 1].Text,
Title = worksheet.Cells[row, 2].Text,
Stock = int.Parse(worksheet.Cells[row, 3].Text),
Price = decimal.Parse(worksheet.Cells[row, 4].Text),
PublisherID = int.Parse(worksheet.Cells[row, 5].Text),
PublisherName = worksheet.Cells[row, 6].Text
});
}
}
var discrepancies = new List<Discrepancy>();
var groupedRecords = new Dictionary<string, Dictionary<string, (decimal Price, int Stock)>>();
foreach (var record in records)
{
cancellationToken.ThrowIfCancellation();
var publisherKey = record.PublisherID.ToString();
var isbnKey = record.ISBN;
if (!groupedRecords.ContainsKey(publisherKey))
{
groupedRecords[publisherKey] = new Dictionary<string, (decimal Price, int Stock)>();
}
if (!groupedRecords[publisherKey].ContainsKey(isbnKey))
{
groupedRecords[publisherKey][isbnKey] = (record.Price, record.Stock);
}
else
{
var existing = groupedRecords[publisherKey][isbnKey];
if (existing.Price != record.Price || existing.Stock != record.Stock)
{
discrepancies.Add(new Discrepancy
{
LineNumber = record.LineNumber,
Publisher = record.PublisherName,
Title = record.Title
});
}
}
}
WriteDiscrepancies(discrepancies);
MessageBox.Show("Processing complete. Check the output file for discrepancies.");
}
private void WriteDiscrepancies(List<Discrepancy> discrepancies)
{
var outputPath = Path.Combine(Path.GetDirectoryName(filePath), "discrepancies.xlsx");
using (var package = new ExcelPackage())
{
var worksheet = package.Workbook.Worksheets.Add("Discrepancies");
worksheet.Cells[1, 1].Value = "LineNumber";
worksheet.Cells[1, 2].Value = "Publisher";
worksheet.Cells[1, 3].Value = "Title";
for (int i = 0; i < discrepancies.Count; i++)
{
worksheet.Cells[i + 2, 1].Value = discrepancies[i].LineNumber;
worksheet.Cells[i + 2, 2].Value = discrepancies[i].Publisher;
worksheet.Cells[i + 2, 3].Value = discrepancies[i].Title;
}
package.SaveAs(new FileInfo(outputPath));
}
}